- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Fri, 23 Sep 2016 11:50:03 -0700
- To: Andy Seaborne <andy@apache.org>, public-sparql-exists@w3.org
On 09/23/2016 03:58 AM, Andy Seaborne wrote: > > > On 22/09/16 17:12, Peter F. Patel-Schneider wrote: >> On 09/22/2016 04:46 AM, Andy Seaborne wrote: > > >>> That is quite serious for SHACL usage. >> >> This is not correct. Some current SPARQL implementations of SHACL >> mayhave to >> change. > > It affects SHACL core constraints because they have SPARQL definitions. So maybe some SPARQL queries and some text may have to change in a working draft. That's insignificant. >> If pre-binding in SHACL uses this method, then the meaning >> of pre-binding will change. Neither of these are serious at all. > > SHACL uses UNION, OPTIONAL and others to build up SPARQL queries. If the > restriction on values for the current row (FILTER EXISTS) is applied only at > the top, this composition will not work. It is not necessary to break that. Not correct. Most of these will still work with no changes. For example, SELECT $this WHERE { OPTIONAL { $this $PATH ?value . } } GROUP BY $this HAVING (COUNT(?value) < $minCount) works without change. Well, it really works without change because there is no EXISTS in it, but it works without change even if pre-binding is done via top-level binding injection. The SPARQL query for sh:uniqueLang does need to change if pre-binding is done via top-level binding injection. But the EXISTS doesn't need to change. As far as I can tell, no specification of a core SHACL constraint component needs to change if EXISTS is defined via top-level binding injection. >>> What substitution (and where it differs from correlated subquery) does is >>> replace, so loosing the binding, which is one of its problems. >> >> I don't understand this. Could you expand it? > > Binding: ?x = <x> > { ?x :p ?o } > > By substitution: > { <x> :p ?o } > which has no ?x binding in the solution mappings and FILTERS needs substitution. > > By VALUES at the point of use: > { <x> :p ?o } > => > { ?x :p ?o . VALUES ?x { <x> } } > > which does have ?x binding in the solution mappings and FILTERS don't need > substitution and "AS ?x" cases work out naturally in a way that can be > statically checked. > > In terms of implementation effort, the logical injection of VALUES at these > points is a bit simpler than substitution (of in-scope) variables because > expressions do not need to be rewritten. > > It is amenable to optimization. Yes, agreed. Binding injection is better than substitution. The question is whether to do it just at top-level or throughout for some definition of throughout. [..] peter
Received on Friday, 23 September 2016 18:50:37 UTC