- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Tue, 18 Apr 2017 10:56:15 -0700
- To: Andy Seaborne <andy@apache.org>, public-sparql-exists@w3.org
On 04/18/2017 10:25 AM, Andy Seaborne wrote: > > > On 18/04/17 17:51, Peter F. Patel-Schneider wrote: >> On 04/18/2017 08:11 AM, Andy Seaborne wrote: >>> >>> On 13/04/17 20:50, Peter F. Patel-Schneider wrote: >>>> Proposal B has another problem related to simplification. >>>> >>>> >>>> The simplification examples in section 18.2.3 of the SPARQL document >>>> show that >>>> simplification is to be performed on join(Z,X) for any X. This >>>> removes the >>>> initial empty BGP in many group graph patterns, including >>>> { VALUES ?junk { } BIND ( ?this AS ?that ) ?that a ex:bad . } >>> >>> A systematic treatment for VALUES would be to add it to the "Values Insertion" >>> step so that the variables of the current row are included. >>> >>> Proposal B is "make the current row available everywhere inside EXISTS" so >>> that seems (to me) like a natural step. >> >> Is this the intent of Proposal B? Is this stated somewhere? > > """ > this alternative mechanism makes the whole of the current row available at any > point in the evaluation of an EXISTS expression > """ This appeared to be me to be mechanism not intent. This should be stated as the intent if that is what it is. >> Currently Proposal B doesn't live up to this intent. Is Proposal B going to >> be modified? If so, are these modifications going to also be made to >> pre-binding in SHAC? It appears that at least one implementation of SHACL >> implements pre-binding, and implements it in a way that doesn't live up to >> this intent. >> >>> That makes a VALUES with no entries behave like an empty BGP in the algebra; >> >> Well, VALUES With no entries already behaved like an empty BGP in SPARQL. > > Actually, no, it doesn't. No entries means zero rows unlike the evaluation of > > Throughout this, I am assuming you meant to say: > > VALUES ?junk { UNDEF } Yes. Silly me. >> The current Proposal B breaks this equivalence. I guess that Proposal B >> could be modified to not break in this way. > > Exactly. > > If Proposal B joins in the current row onto the values is one row of zero > variables (which "VALUES ?junk { UNDEF }" is) > > Treatment of VALUEs becomes more systematic for all base of the zero-input > algebra operations. > >> >>> there is already a restriction on using the a potential current row variables. >> >> The restriction was recently added. I don't see any reason for the >> restriction. There is no techical reason to add the restriction, which >> really only serves to make Proposal B less useful that it might otherwise >> be. > > That's your opinion. There is no technical problem in Proposal B with VALUES for a current-row variable that aren't shared with other uses of VALUES. The syntactic restriction removes marginally useful constructs like SELECT * WHERE { VALUES ?a { ex:a ex:b } FILTER EXISTS { VALUES ?a { ex:a } } } So no technical reason for the exclusion of some useful queries. > I see it as consistent to take the assignment-once nature of SPARQL as > important in explaining to people what is going on. But VALUES isn't assignment. SPARQL queries like SELECT * WHERE { BIND ( ex:a AS ?a ) VALUES ?a { ex:a ex:b } } are allowed so I see the limitation on VALUES as harder to explain than not having it. > If the current row is joined on, of course, they become quite similar (not the > same). I dislike the possibly unexpected effect of causing a VALUES to become > zero rows; it has no use and will be confusing. This would be no different than any join that ends up with zero rows, such as SELECT * WHERE { ?a ex:a ex:a . VALUES ?a { ex:b } } against the graph ex:a ex:a ex:a . [ second half split off] peter >>>> resulting in >>>> Join( Extend( empty multiset, ?that, ?this ), BGP( ?that a ex:bad ) ) >>>> so in >>>> SELECT ?this WHERE { >>>> ?this a ex:good . >>>> FILTER EXISTS { BIND ( ?this AS ?that ) ?that a ex:bad } >>>> } >>>> solutions will be returned for every direct instance of ex:good if >>>> there is >>>> any direct instance of ex:bad, counter to expectations. >>> >>> This second case is not VALUES. >> >> Sure, but the problem here is that simplification in SPARQL can remove the >> empty BGP that is needed for Proposal B to have effect in some places. (See >> below for a fixed example, though.) >> >>> SELECT * { >>> BIND ( ?this AS ?that ) ?that a ex:bad >>> } >>> >>> is the algebra: >>> >>> (join >>> (extend ((?that ?this)) >>> (Z - empty BGP)) >>> (bgp (triple ?that rdf:type ex:bad)) >>> ) >>> >>> Simplification does not occur - the empty BGP is inside the (extend) so there >>> is not a "form join(Z,X)".
Received on Tuesday, 18 April 2017 17:56:54 UTC