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

Reply via email to