Hi all,
I recently ran into an edge case and want to clarify my understanding.
The issue is related to the difference between
1. select * { :x :p ?v . FILTER(?v =) }
2. select * { :x :p ?v . { FILTER(?v =) } }
Where #2 can never return results because ?v is not in scope when the filter is
evaluated.
I'm interested in a more complex query that uses UNION. Suppose I have this
data:
<http://ex#a1> <http://ex#p1> <http://ex#b1> .
<http://ex#c1> <http://ex#p2> <http://ex#no-match> .
<http://ex#c2> <http://ex#p2> <http://ex#b1> .
<http://ex#a2> <http://ex#p1> <http://ex#b2> .
<http://ex#c1> <http://ex#p3> <http://ex#no-match> .
<http://ex#c2> <http://ex#p3> <http://ex#b2> .
This query will return results
prefix : <http://ex#>
select * {
?a :p1 ?b .
?c :p2 ?d . filter( ?b =d )
}
as will this one
prefix : <http://ex#>
select * {
?a :p1 ?b .
?c :p3 ?d . filter( ?b =d )
}
Now lets combine them with UNION:
prefix : <http://ex#>
select * {
?a :p1 ?b .
{ ?c :p2 ?d . filter( ?b =d ) }
union
{ ?c :p3 ?d . filter( ?b =d ) }
}
Whoopts! No results. I believe that the reason is the same as with the simpler
FILTER case above: ?join1 is not in scope when the filter is evaluated.
Obviously in this case the filters are the same and I can ask the query I want
by moving it outside the UNION:
prefix : <http://ex#>
select * {
?a :p1 ?b .
{ ?c :p2 ?d . }
union
{ ?c :p3 ?d . }
filter( ?b =d )
}
But it still seems counter-intuitive to me that adding the union should change
the meaning of the query so much.
I'd appreciate any insight on this.
thanks,
--
Gary Warren King, metabang.com
Cell: (413) 559 8738
Fax: (206) 338-4052
gwkkwg on Skype * garethsan on AIM * gwking on twitter