- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Fri, 23 Sep 2016 12:59:47 -0700
- To: Andy Seaborne <andy@apache.org>, public-sparql-exists@w3.org
Here is the complete proposal for the initial top-level-only binding
injection definition of EXISTS, taken from a paper by David Martin and
myself to be presented at ISWC in October.
1. Add a new construct, Initial, to the SPARQL syntax and algebra. Initial
will be used to set up the initial multiset of solution mappings inside
an EXISTS. It will work much like VALUES except that it will transfer
solution mappings through the EXISTS instead of setting up a constant
solution mapping. Initial is a new option for GraphPatternNotTriples in
the SPARQL syntax but cannot show up in actual SPARQL code, just during
the SPARQL translation process. Initial takes a single argument that is
a token (which can just be an integer).
2. When collecting FILTER elements replace EXISTS{pattern} in the filter
expression with
exists(t,translate( {Initial(t) pattern'}))
where t is a fresh token, and similarly for NOT EXISTS{pattern}. Note
that the argument to translate, {Initial(t) pattern'} is SPARQL syntax.
If pattern is a SubSelect then pattern' is {pattern} otherwise pattern'
is just pattern.
3. Translate Initial(t) as itself.
4. Change the definition of the exists function to:
Let mu be the current solution mapping for a filter, t a token, and P a
graph pattern: The value exists(t,P) given D(G) is true iff eval(D(G),P')
is a non-empty multiset of solution bindings, where P' is P with (its
sole occurence of) Initial(t) replaced by mu.
Pre-binding can be defined as performing this injection on the
GroupGraphPattern of the top-level WhereClause of a query (or equivalent for
certain query forms).
peter
Received on Friday, 23 September 2016 20:00:18 UTC