- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Wed, 28 Sep 2016 20:20:16 -0700
- To: Andy Seaborne <andy@apache.org>, public-sparql-exists@w3.org
It looks to me as if the definition of Exists here is really going to be along the lines of: Let μ be the current solution mapping for a filter and P a graph pattern: The value exists(P) given D(G) is true if and only if eval(D(G), P') is a non-empty sequence. Here P' is P with each BGP(...) in P replaced by Join(BGP(...), μ') (or maybe Join(μ', BGP(...))) where μ' is the same as μ except that it only maps variables that are STILL-IN-SCOPE at the point of the BGP(...) in P. STILL-IN-SCOPE is defined as v is STILL-IN-SCOPE at P if v is mapped in the current solution mapping for Exists(P) if v is STILL-IN-SCOPE at an expression E then v is STILL-IN-SCOPE for each subexpression of E if v is STILL-IN-SCOPE at A(...), an application of a symbol in the SPARQL algebra to some arguments, then v is STILL-IN-SCOPE at each expression and pattern argument to A and to each expression and pattern element of a list or set that is an argument to A UNLESS A(...) is of the form Project(P,{v1,...,vn}) and v is one of the vi. Most of this machinery is to set up a particular meaning for EXISTS { SELECT ?o WHERE { FILTER ( ?o = 4 ) } } even though the current SPARQL spec breaks here. If there is freedom to do something else in this case then a simpler solution is possible. Let μ be the current solution mapping for a filter and P a graph pattern: The value exists(P) given D(G) is true if and only if eval(D(G), P') is a non-empty sequence. Here P' is P with each BGP(...) in P that is not within a Project application in P replaced by Join(BGP(...), μ) (or maybe Join(μ, BGP(...))) This would be the analogue of changing my proposal to 2/ When collecting FILTER elements replace EXISTS{P} in the filter expression with exists(t,translate( P' )) where t is a fresh token and similarly for NOT EXISTS{P}. If P is a SubSelect then P' is { Initial(t) { P } } otherwise P' is P with each GroupGraphPattern { Q } in P that is not inside a SubSelect replaced with { Initial(t) Q } peter On 09/28/2016 04:44 PM, Andy Seaborne wrote: > ** Intuition/Outline > > Ensure that the variables from the row being filtered are available, not just > their values as in the spec with substitution. > > This is done by restricting the variable to the value of the row at the point > where the variable is being bound. This is in a BGP. Use of AS ?x for ?x in > the current row is not allowed : ?x is considered to be already set. > > ** Proposal > > Rewrite the pattern of the EXISTS filter; do this in a deep fashion, while > respecting scoping rules. > > Let V = in-scope variables at the point of the FILTER EXISTS. > > For each BGP in the pattern: > Build a VALUES with variables of V still in-scope at this BGP. > This includes empty BGPs > > Scoping applies. > > ** Relationship to Issues > > * Problem 2: Substitution happens where definitions are only for > variables > > Variables are retained so e.g. BOUND(?var) remains unchanged. > > The row being tested has already defined ?VAR so by the rule of no > reassignment, using VALUE ?VAR at the BGP makes these illegal if a BGP used > ?VAR : this is true at present. We can leave things as they are. ?VAR gets > bound and presumably joined at some point (or it's out of scope). > > Separately, a rule to forbid these forms might be clearer to users and in the > spirit of ?VAR being fixed. Then we can rewrite BGPs to include all vars. > > * Problem 3: Blank nodes substituted into BGPs act as variables > > No blank nodes are introduced into BGPs by substitution. > > Binding for ?o = _:b > { ?s ?p ?o } => { ?s ?p ?o . VALUES ?o {_:b} } > > (in the algebra where _:b is not going to be remapped by surface syntax parsing) > > * Problem 4: Substitution can flip MINUS to its disjoint-domain case > > The domain of MINUS retains the same variables. >
Received on Thursday, 29 September 2016 03:20:50 UTC