Hi Sören,
The same query is actually being passed by PHP to the Virtuoso as I can see the
query it receives using the trace_on('exec') call to enable tracing of SQL
stmts in Virtuoso:
sparql SELECT DISTINCT ?o FROM<http://mytest> WHERE {?s a ?o}
What I do also see in the Virtuoso log though is the following timeout error as
the server seems to be in some kind of loop retrieving the same value each time
until it times out:
07:44:01 PHP Fatal error: Maximum execution time of 30 seconds
exceeded in C:\Program Files\OpenLink Software\Virtuoso 6.2\vsp\mytest.php on
line 5
Why adding the "count(*)" to the select list resolves the problem is
confusing/weird ???
The reason the query works with the "odbc_result_all()" call in my php sample,
but fails with your sample which uses the "odbc_fetch_array()" function is
because the former leaves the SQL_CURSOR_TYPE at the default of
"SQL_CURSOR_FORWARD_ONLY", whereas the latter sets it to "SQL_CURSOR_STATIC" ,
which if do directly in ODBC enables me to recreate the issue with PHP in the
mix . So we we need to look into the cause of this error when
"SQL_CURSOR_STATIC" is used.
I shall let you know when we have a fix ...
Best Regards
Hugh Williams
Professional Services
OpenLink Software
Web: http://www.openlinksw.com
Support: http://support.openlinksw.com
Forums: http://boards.openlinksw.com/support
Twitter: http://twitter.com/OpenLink
On 22 Nov 2010, at 09:00, Sören Auer wrote:
> Thanks Hugh for the quick reply!
>
> Its quite weired, that the PHP odbc drive has such side-effects - I thought
> the odbc client just forwards the query to the server and makes the results
> it obtains from there available.
>
> I somehow found a workaround last night - simply also selecting COUNT(*)
> seems to return correct results:
>
> SELECT DISTINCT ?o, COUNT(*) FROM <http://mytest.com> WHERE {?s a ?o}
>
> I guess from that perspective I'm fine for now. Might however be still worth
> fixing the bug for some upcomming Virtoso release, in case other people have
> the same problem.
>
> Best,
>
> Sören
>
>
> On 22.11.2010 2:18, Hugh Williams wrote:
>> Hi Sören,
>>
>> I have installed the 1M BSBM data into a 64bit Windows Virtuoso 6.2 instance
>> and querying via the Conductor , isql or ODBC Directly I get the same 159
>> distinct rows returned:
>>
>> $ /opt/virtuoso/bin/isql opluswinbuild:1111
>> Connected to OpenLink Virtuoso
>> Driver: 06.02.3128 OpenLink Virtuoso ODBC Driver
>> OpenLink Interactive SQL (Virtuoso), version 0.9849b.
>> Type HELP; for help and EXIT; to exit.
>>
>> SQL> sparql SELECT DISTINCT ?o FROM<http://mytest> WHERE {?s a ?o};
>> o
>> VARCHAR
>> _______________________________________________________________________________
>>
>> http://xmlns.com/foaf/0.1/Person
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/ProductType1
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/ProductType
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/ProductType2
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/ProductType3
>> .
>> .
>> .
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/ProductType150
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/ProductType151
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/ProductFeature
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/Producer
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/Product
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/Vendor
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/Offer
>> http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/Review
>>
>> 159 Rows. -- 958 msec.
>> SQL>
>>
>> So the problem is not in the ODBC layer, but rather in the PHP ODBC
>> interface it seems.
>>
>> In fact the problem seems to be with the "odbc_fetch_array()" function which
>> is fetching an array of results , as If I use the following sample PHP code
>> which selects one row at a time the correct 159 distinct rows are returned:
>>
>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
>> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
>>
>> <html xmlns="http://www.w3.org/1999/xhtml">
>> <head>
>> <title>PHP ODBC test</title>
>> <style type="text/css">
>> body { padding: 1em; }
>> pre { padding: 0.3em; background-color: #e0e0e0; border: solid 1px silver }
>> </style>
>> </head>
>>
>> <body>
>> <h1>Test PHP / ODBC / Virtuoso connection</h1>
>> <hr />
>>
>> <pre>
>>
>>
>> <?php
>> ini_set("odbc.default_cursortype", "0");
>>
>> $con=odbc_connect("Local Virtuoso", "dba", "dba");
>> if($con) {
>> printf("<p>Connected [%s].\n</p>\n", $con);
>>
>> $query="sparql SELECT DISTINCT ?o FROM<http://mytest> WHERE {?s a ?o}";
>>
>> print "Executing query [$query]<br />\n";
>> $rs = odbc_exec($con, $query);
>>
>> $err=odbc_errormsg($con);
>> print "Current error state: [$err]<br />\n";
>>
>> print "Results:<br />\n";
>> odbc_result_all($rs, "border=2");
>> odbc_close($con);
>> } else {
>> print "<p>Failed to connect!</p>\n";
>> }
>> ?>
>>
>> ?>
>>
>> <hr />
>> </body>
>> </html>
>>
>> Lifted from
>> http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtuosoPHP
>> documentation.
>>
>> I shall look into why the "odbc_fetch_array()" function is problematic in
>> the morning ...
>>
>> Best Regards
>> Hugh Williams
>> Professional Services
>> OpenLink Software
>> Web: http://www.openlinksw.com
>> Support: http://support.openlinksw.com
>> Forums: http://boards.openlinksw.com/support
>> Twitter: http://twitter.com/OpenLink
>>
>> On 21 Nov 2010, at 22:09, Sören Auer wrote:
>>
>>> Hi all,
>>>
>>> I have a problem with a SPARQL query using the DISTINCT feature.
>>> I installed the commercial Virtuoso 6.2 distribution for Windows.
>>> In order to run some experiments, I loaded the 1M BSBM data [1].
>>>
>>> When I run the following query in conductor I get the correct results:
>>>
>>> SELECT DISTINCT ?o FROM<http://mytest.com> WHERE {?s a ?o}
>>>
>>> However, when running the same query from a hosted PHP script, the
>>> results are not distinct anymore and I also get only a small subset:
>>>
>>> <?php
>>> $c=odbc_connect("Local Virtuoso",'dba','dba');
>>> $r=odbc_exec($c,'sparql SELECT DISTINCT ?o FROM<http://mytest.com>
>>> WHERE {?s a ?o}');
>>> while($row=odbc_fetch_array($r))
>>> print_r($row);
>>> ?>
>>>
>>> What's the problem? How can it be that I get different results from
>>> conductor and when submitting a query via ODBC? Or am I doing something
>>> wrong?
>>>
>>> Best,
>>>
>>> Sören
>>>
>>> [1]
>>> http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/datasets/qualification.ttl.gz
>>>
>>> ------------------------------------------------------------------------------
>>> Beautiful is writing same markup. Internet Explorer 9 supports
>>> standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2& L3.
>>> Spend less time writing and rewriting code and more time creating great
>>> experiences on the web. Be a part of the beta today
>>> http://p.sf.net/sfu/msIE9-sfdev2dev
>>> _______________________________________________
>>> Virtuoso-users mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/virtuoso-users
>>
>