- From: Lee Feigenbaum <lee@thefigtrees.net>
- Date: Thu, 25 Oct 2007 16:09:07 -0400
- To: Francis McCabe <frankmccabe@mac.com>
- CC: public-rdf-dawg-comments@w3.org
Francis McCabe wrote:
>
> I am having some trouble reconciling this test with the spec, the
> reported results of the query.
>
> The test reads:
>
> FILTERs in an OPTIONAL do not extend to variables bound outside of the
> LeftJoin(...) operation
>
>
>
> however, the spec reads
>
> Query variables in SPARQL queries have global scope; use of a given
> variable name anywhere in a query identifies the same variable.
Hi Frank,
These two bits of text are compatible. The second piece of text
indicates that anywhere that the lexical token ?v appears in a query
refers to the same variable. The first piece of text indicates that a
FILTER clause in an OPTIONAL only filters solutions with respect to the
LeftJoin(...) algebra expression in which it appears.
More on this specific example:
>
> The reported results of the test:
>
> PREFIX : <http://example/>
>
> SELECT *
> {
> :x :p ?v .
> { :x :q ?w
> OPTIONAL { :x :p ?v2 FILTER(?v = 1) }
> }
> }
>
> include the results
>
> v w
[snip]
To simplify, note that the results of this test are every possible pair
of values for ?v (objects of :p) and ?w (objects of :q).
> (My formatting, the XML is illegible by mortals)
:-)
> However, I think that the test is wrong: v2 should be v. On my budding
> implementation, I get the above results only if I change v2 to v. If I
> don't, I get:
>
I believe the test is correct. Here's what happens:
After following the algorithm in #convertGraphPattern, the above query
corresponds to this algebra expression:
Join(BGP(:x :p ?v), LeftJoin(BGP(:x :q ?w), BGP(:x :p ?v2), ?v = 1)
The filter (?v = 1) is tied to the LeftJoin. Of course, all of the
solutions to Join(BGP(:x :q ?w), BGP(:x :p ?v2)) fail that filter since
none of the solutions bind ?v. Therefore, the filter on the LeftJoin
rejects all of the "extended" solutions (the solutions composed from
both the left-hand and right-hand sides of the OPTIONAL). That means
that the solutions to the LeftJoin(...) are just the solutions of the
left-hand side:
?w ?v2
---------
1 unbound
2 unbound
3 unbound
The solutions to the other BGP are straightforward
?v
--
1
2
3
4
...and the conjunction of those two result sets are the results as given
in the test suite (the XML result format omits unbound variables)
I hope this is helpful.
Lee
> v v2 w
> (4, (null), 3)
>
> (4, (null), 2)
>
> (4, (null), 1)
>
> (3, (null), 3)
>
> (3, (null), 2)
>
> (3, (null), 1)
>
> (2, (null), 3)
>
> (2, (null), 2)
>
> (2, (null), 1)
>
> (1, 4, 3)
>
> (1, 3, 3)
>
> (1, 2, 3)
>
> (1, 1, 3)
>
> (1, 4, 2)
>
> (1, 3, 2)
>
> (1, 2, 2)
>
> (1, 1, 2)
>
> (1, 4, 1)
>
> (1, 3, 1)
>
> (1, 2, 1)
>
> (1, 1, 1)
>
>
> Note that optional implies that there will be solutions that do not bind
> v2.
>
> I would appreciate clarification on this matter.
>
>
>
> Frank
>
>
>
>
>
>
Received on Thursday, 25 October 2007 20:09:26 UTC