- From: Axel Polleres <droxel@gmail.com>
- Date: Thu, 30 Jun 2016 15:07:53 +0200
- To: "Peter F. Patel-Schneider" <pfpschneider@gmail.com>
- Cc: Andy Seaborne <andy@apache.org>, public-sparql-dev@w3.org
Thanks a lot for the summary, Peter! Axel -- url: http://www.polleres.net/ twitter: @AxelPolleres > On 30 Jun 2016, at 15:05, Peter F. Patel-Schneider <pfpschneider@gmail.com> wrote: > > On 06/30/2016 04:50 AM, Axel Polleres wrote: >> Dear Andy, >> >> sure, happy to join. I have to admit that I am still unsure whether there is really a *bug* in the specification (in the sense that it would be something that could be fixed by an erratum), or whether just what >> the spec describes something in an unambiguous way, but it is just not what people would expect (which indeed would need if we wanted to propose an alternative to change/re-spec). >> >> I have to admit I couldn't follow the whole discussion but is there a mail/link which summarizes the issues (I am aware of the bnode injection issue, which more there are?) >> >> Thanks & best regards, >> Axel > > Hi Axel: > > I don't think that there is an email that is exactly what you asked for so I > have tried to put together a simple list of problems with EXISTS. The first > two problems are directly problems with the spec. The last three are cases > where the spec produces what can be considered to be counterintuitive results > and some implementations diverge from the spec. > > > Problem 1: Some uses of EXISTS are undefined > > exists is only defined for graph patterns, but in > SELECT ?x WHERE { > ?x :p :c . > FILTER EXISTS { SELECT ?y { ?y :q :c . } } } > the argument to exists ends up being a ToMultiSet, which is not listed under > "Graph Pattern" in the table of SPARQL algebra symbols. > > > Problem 2: Substitution happens where definitions are only for variables > > In > SELECT ?x WHERE { > BIND ( :d AS ?x ) > FILTER EXISTS { SELECT ?x { :b :p :c } } } > the substitute ends up producing > ToMultiSet(Project(ToList(BGP( :b :p :c )),{:d})) > However Project is only defined for variables in its second argument. > > This also affects Extend, multisets, BOUND, and maybe other constructs. > > > Problem 3: Blank nodes substituted into BGPs act as variables > > In > SELECT ?x WHERE { > ?x :p :d . > FILTER EXISTS { ?x :q :b . } } > against the graph { _:c :p :d , :e :q :b } > the substitute ends up producing > BGP(_:c :q :b) > when then matches against :e :q :b. > > This is counterintuitive. Some implementations diverge from the spec here. > > > Problem 4: Substitution can flip MINUS to its disjoint case > > In > SELECT ?x WHERE { > ?x :p :c . > FILTER EXISTS { ?x :p :c . MINUS { ?x :p :c . } } } > against the graph { :d :p :c } the substitute ends up producing > Minus( BGP( :d :p :c ), BGP( :d :p :c ) ) > which produces a non-empty result. > > This is counterintuitive. Some implementations diverge from the spec here. > > > Problem 5: Substitution affects disconnected variables > > In > SELECT ?x WHERE { > BIND ( :d AS ?x ) > FILTER EXISTS { BIND ( :e AS ?z ) > SELECT ?y WHERE { ?x :p :c } } } > the substitute ends up producing > Join ( Extend( Z, ?z :e ), > ToMultiSet( Project( ToList( BGP( :d :p :c ) ), {?y} ) ) ) > > This may be counterintuitive. Some, but not all, implementations diverge > from the spec here.
Received on Thursday, 30 June 2016 13:08:25 UTC