- From: Seaborne, Andy <andy.seaborne@hp.com>
- Date: Wed, 27 Jun 2007 17:52:56 +0100
- To: Steve Harris <steve.harris@garlik.com>
- CC: RDF Data Access Working Group <public-rdf-dawg@w3.org>
Steve Harris wrote:
> I've a question regarding the filter-scope-1 test, I would have
> expected the results below, which would be equivalent to FILTER(0)
> after http://www.w3.org/TR/rdf-sparql-query/
> ยง 6.2, but instead I see something equivalent to if the OPTIONAL
> block were missing entirely.
>
> I can't find anything in the spec which suggests that evaluating a
> FILTER() expression with out of scope variables should cause the
> entire enclosing block to be disregarded. Though, I may have just
> missed it.
>
> I'm also not sure I like this scoping rule, it rules out some
> potentially useful query forms, like:
>
> SELECT *
> WHERE {
> ?person :department ?dept .
> OPTIONAL {
> ?person :project ?proj .
> FILTER(?dept = :technology)
> }
> }
This is not the same case as the next example because of teh extra {} below:
This is:
(leftjoin
(BGP [triple ?person :department ?dept])
(BGP [triple ?person :project ?proj])
(= ?dept <http://example/technology>))
?dept is in scope because it becomes part of the left join condition.
?person :project ?proj is included when (?dept = :technology).
>
> Data:
>
> @prefix : <http://example/> .
>
> :x :p 1 .
> :x :p 2 .
> :x :p 3 .
> :x :p 4 .
>
> :x :q 1 .
> :x :q 2 .
> :x :q 3 .
>
> Query:
>
> PREFIX : <http://example/>
> SELECT *
> {
> :x :p ?v .
> { :x :q ?w
> OPTIONAL { :x :p ?v2 FILTER(?v = 1) }
> }
> }
Because of the extra {} this is a different structure to the first example:
(join
(BGP [triple :x :p ?v])
(leftjoin
(BGP [triple :x :q ?w])
(BGP [triple :x :p ?v2])
(= ?v 1))
)
>
> What I would expect: (excuse the use of NULL)
I'm having difficulty at this point : Could you explain why you expect 48
(4*3*4) results all of which have ?v2 null? Even old style, that wouldn't
happen (i.e. get 4 matches when ?v = 1 and one otherwise).
It seems to have include { :x :p ?v2 } matches multiple times even when ?v !=
1 And for whatever evaluation we have, why is ?v2 null when ?v = 1?
In evaluation terms, the extra nesting given by the {} introduce a JOIN.
:x :p ?v .
is one part and
{ :x :q ?w
OPTIONAL { :x :p ?v2 FILTER(?v = 1) }
}
the other part.
If you remove the {}
PREFIX : <http://example/>
SELECT *
{
:x :p ?v .
:x :q ?w
OPTIONAL { :x :p ?v2 FILTER(?v = 1) }
}
the solutions are :
--------------
| v | w | v2 |
==============
| 4 | 3 | |
| 4 | 2 | |
| 4 | 1 | |
| 3 | 3 | |
| 3 | 2 | |
| 3 | 1 | |
| 2 | 3 | |
| 2 | 2 | |
| 2 | 1 | |
| 1 | 3 | 4 |
| 1 | 3 | 3 |
| 1 | 3 | 2 |
| 1 | 3 | 1 |
| 1 | 2 | 4 |
| 1 | 2 | 3 |
| 1 | 2 | 2 |
| 1 | 2 | 1 |
| 1 | 1 | 4 |
| 1 | 1 | 3 |
| 1 | 1 | 2 |
| 1 | 1 | 1 |
--------------
>
> ?v ?w ?v2
> 1 1 NULL
> 1 1 NULL
> 1 1 NULL
> 1 1 NULL
> 1 3 NULL
> 1 3 NULL
> 1 3 NULL
> 1 3 NULL
> 1 2 NULL
> 1 2 NULL
> 1 2 NULL
> 1 2 NULL
> 3 1 NULL
> 3 1 NULL
> 3 1 NULL
> 3 1 NULL
> 3 3 NULL
> 3 3 NULL
> 3 3 NULL
> 3 3 NULL
> 3 2 NULL
> 3 2 NULL
> 3 2 NULL
> 3 2 NULL
> 2 1 NULL
> 2 1 NULL
> 2 1 NULL
> 2 1 NULL
> 2 3 NULL
> 2 3 NULL
> 2 3 NULL
> 2 3 NULL
> 2 2 NULL
> 2 2 NULL
> 2 2 NULL
> 2 2 NULL
> 4 1 NULL
> 4 1 NULL
> 4 1 NULL
> 4 1 NULL
> 4 3 NULL
> 4 3 NULL
> 4 3 NULL
> 4 3 NULL
> 4 2 NULL
> 4 2 NULL
> 4 2 NULL
> 4 2 NULL
Andy
--
Hewlett-Packard Limited
Registered Office: Cain Road, Bracknell, Berks RG12 1HN
Registered No: 690597 England
Received on Wednesday, 27 June 2007 16:53:10 UTC