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