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,
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,