Hi,

I observed the following SPARQL behavior with Virtuoso Open Source, Version 06.01.3127, running on Linux version 2.6.27.56-0.1-xen (geeko@buildhost) (gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux) ) #1 SMP 2010-12-01 16:57:58 +0100:

Given the following test graph:

create graph <http://alx.neofonie.de/test>

prefix test:<http://alx.neofonie.de/test/>
insert into <http://alx.neofonie.de/test> {
  _:b1 a test:Relation .
  _:b1 test:agent test:A1 .
  _:b1 test:range test:R1 .
  _:b2 a test:Relation .
  _:b2 test:agent test:A2 .
  _:b2 test:range test:R1 .
  _:b3 a test:Relation .
  _:b3 test:agent test:A2 .
  _:b3 test:range test:R2 .
}

... the following query:

prefix test:<http://alx.neofonie.de/test/>
select ?agent ?range
from <http://alx.neofonie.de/test>
where {
  _:b a test:Relation .
  filter (?agent = test:A1)
  optional{ _:b test:agent ?agent.}
  optional{ _:b test:range ?range.}
}

... returns (as CSV):

"agent","range"
"http://alx.neofonie.de/test/A1","http://alx.neofonie.de/test/R1";
"http://alx.neofonie.de/test/A1","http://alx.neofonie.de/test/R1";
"http://alx.neofonie.de/test/A1","http://alx.neofonie.de/test/R2";

... which contains the wrong (because non existing) result A1/R2.

Obviously, the filter expression binds ?agent to test:A1 if it is not bound by the first optional sub query. This can easily be seen by omitting the filter.

The question is: Does this behavior conform to the SPARQL spec or is this a Virtuoso bug?

This sentence from http://www.w3.org/TR/rdf-sparql-query/ ,
section 3, makes me think it is probably a bug:

"Graph pattern matching produces a solution sequence, where each solution has a set of bindings of variables to RDF terms. SPARQL FILTERs restrict solutions to those for which the filter expression evaluates to TRUE."

The filter expression, ?agent = test:A1, should not evaluate to TRUE if ?agent is not bound, and it should also not bind ?agent to test:A1.

Regards,
Martin

--

(Of course, one can just make the first optional binding a required binding (result: A1/R1), or move the filter into the first optional block (result: _/R1, A1/R1, _/R2) to obtain results that make more sense. The example is a stripped down version of a more complex use case.)


--
------------------------------------------------------------------------

*Martin Gerlach*
Senior Softwareentwickler
Research

Neofonie GmbH
Robert-Koch-Platz 4
10115 Berlin

T +49.30 24627 *413*
F +49.30 24627 120
[email protected]
http://www.neofonie.de

Handelsregister
Berlin-Charlottenburg: HRB 67460

Geschäftsführung
Thomas Kitlitschko
Dr. Mario Lenz


Reply via email to