- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Tue, 18 Apr 2017 11:24:14 -0700
- To: Andy Seaborne <andy@apache.org>, public-sparql-exists@w3.org
[Second half only.]
>> SELECT ?this WHERE {
>> ?this a ex:good .
>> FILTER EXISTS { { SELECT * WHERE { } }
>> BIND ( ?this AS ?that )
>> ?that a ex:bad } }
>>
>> peter
>>
>
> Simplification applies after syntax parsing, before evaluation.
>
> Inner "SELECT * {}" is a project of no variables of the unit table which is
> left as-is. So no simplification.
>
> 18.2.4.4
> "The set PV is used later for projection."
>
> 18.2.5.2 Projection
> """
> The set of projection variables, PV, was calculated in the processing of
> SELECT expressions.
>
> M := Project(M, PV)
> """
>
> There is something to account for in SELECT * but it's not simplification.
>
> Andy
As far as I can tell the inner select is translated (see last example in
18.2.3) as
ToMultiSet(Project(Z,{}))
The argument to EXISTS is translated (19.2.2.6) as
Join( Extend(Join(Z,ToMultiSet(Project(Z,{}))),?that,?this),
BGP(?that rdf:type ex:bad )
Simplification (18.2.2.8) then results in
Join( Extend(ToMultiSet(Project(Z,{})),?that,?this),
BGP(?that rdf:type ex:bad) )
So the EXISTS is translated to
exists(
Join( Extend(ToMultiSet(Project(Z,{})),?that,?this),
BGP(?that rdf:type ex:bad) ) )
Evaluation of the EXISTS with ?this mapped to ex:i proceeds by first doing
the replacement, which ends up with something like
Join( Extend(ToMultiSet(Project(Join(Z,{{?this,ex:i}}),{})),?that,?this),
Join(BGP(?that rdf:type ex:bad),{{?this,ex:i}}) )
This is evaluated to
Join( Extend({{}},?that,?this),
Join(BGP(?that rdf:type ex:bad),{{?this,ex:i}}) )
and then to
Join( {{}},
Join(BGP(?that rdf:type ex:bad),{{?this,ex:i}}) )
The BIND then ends up not having any effect because ?this doesn't have a
binding when it is evaluated, due simplification removing the place where
the FILTER variables might have been joined in.
peter
Received on Tuesday, 18 April 2017 18:24:51 UTC