@@ -10429,7 +10429,7 @@ <h3>Evaluation Semantics</h3>
10429
10429
<section>
10430
10430
<h3>Values Insertion and `EXISTS`</h3>
10431
10431
<div class="ednote">
10432
- <p>The following subsections contain draft of material for a revised
10432
+ <p>The following subsections contain draft material for a revised
10433
10433
"`exists`" operation.
10434
10434
</p>
10435
10435
<p>
@@ -10444,7 +10444,10 @@ <h4>Syntax Restriction</h4>
10444
10444
This applies to `BIND`, variables introduced by `AS` in a `SELECT` clause, variables in a `VALUES`
10445
10445
clause, and variables introduced by `AS` in `GROUP BY`.
10446
10446
</blockquote>
10447
- <p>Extend the "in-scope" rules to include the variables in-scope from the current row:</p>
10447
+ <p>
10448
+ Extend the "in-scope" rules to include the possible
10449
+ variables that are in-scope for the current row:
10450
+ </p>
10448
10451
<table style="border-collapse: collapse; border-color: #000000; border-spacing:5px; border-width: 1px">
10449
10452
<tbody>
10450
10453
<tr>
@@ -10458,10 +10461,15 @@ <h4>Syntax Restriction</h4>
10458
10461
</tr>
10459
10462
</tbody>
10460
10463
</table>
10461
- <p class="note">
10462
- This restriction means that <a href="#defn_valuesinsertion">values inserted</a>
10463
- do not conflict with values assigned to variables within the pattern.
10464
- </p>
10464
+ <div class="note">
10465
+ <p>
10466
+ This restriction means that <a href="#defn_valuesinsertion">values inserted</a>
10467
+ do not conflict with values assigned to variables within the pattern.
10468
+ </p>
10469
+ <p>
10470
+ This operation is performed as part of query parsing.
10471
+ </p>
10472
+ </div>
10465
10473
</section>
10466
10474
<section>
10467
10475
<h4>Remapping</h4>
@@ -10514,39 +10522,88 @@ <h4>Remapping</h4>
10514
10522
Replacements may happen several times, depending on recursive order
10515
10523
but each time a replacement is made, the variable not used anywhere else.
10516
10524
</p>
10517
-
10518
- <p class="note">
10519
- A variable inside a project expression that is not in the variables projected
10520
- is not affected by the values insertion operation because it is renamed apart.
10521
- </p>
10525
+
10526
+ <div class="note">
10527
+ <p>
10528
+ A variable inside a project expression that is not in the variables projected
10529
+ is not affected by the values insertion operation because it is renamed apart.
10530
+ </p>
10531
+ <p>
10532
+ This operation is as part of the <a href="#sparqlQuery">translation to the SPARQL
10533
+ algebra</a>.
10534
+ </p>
10535
+ </div>
10522
10536
</section>
10523
10537
<section>
10524
10538
<h4>Values Insertion</h4>
10539
+ <p>
10540
+ Alternative 1: rewrite the algebra during
10541
+ <a href="#sparqlQuery">translation to the SPARQL algebra</a>
10542
+ to include a function that evaluates to the current row.
10543
+ </p>
10544
+
10525
10545
<div class="defn">
10526
10546
<div>
10527
- <b>Definition: <span id="defn_valuesinsertion " name="defn_valuesinsertion ">Values Insertion </span></b>
10547
+ <b>Definition: <span id="defn_correlate " name="defn_correlate ">Values In Scope </span></b>
10528
10548
<p>
10529
- Define the Values Insertion function `ValuesInsert(X, μ)`
10549
+ Define the function `BindingInScope()`.
10550
+ Evaluation of `BindingInScope()` results in a table of one row,
10551
+ being the current binding of the enclosing filter.
10530
10552
</p>
10531
- <pre>Let Table(μ) = { μ } and multiplicity( μ | Table(μ) = { μ } ) = 1
10553
+ </div>
10554
+ </div>
10532
10555
10556
+ <div class="defn">
10557
+ <div>
10558
+ <b>Definition: Access to the current binding</b>
10559
+ <p>
10560
+ During <a href="#sparqlQuery">translation to the SPARQL algebra</a>
10561
+ </p>
10562
+ <pre>
10533
10563
Replace each occurence of `Y` in X where `Y` is one of
10534
10564
<a href="#sparqlTranslateBasicGraphPatterns">Basic Graph Pattern</a>,
10535
10565
<a href="#sparqlTranslatePathExpressions">Property Path Expression</a>,
10536
10566
<a href="#sparqlTranslateGraphPatterns">`Graph(Var, pattern)`</a>,
10537
10567
<a href="#https://www.w3.org/TR/sparql12-query/#sparqlTranslateGraphPatterns">Inline Data</a>
10538
- with `join(Y, Table(μ))`.</pre>
10539
-
10568
+ with `join(Y, BindingInScope())`.</pre>
10569
+ </div>
10570
+ <div class="note">
10571
+ c.f. section <a href="#sparqlTranslateGraphPatterns">Translate Graph Patterns</a>
10572
+ where an empty basic graph pattern start any
10573
+ <a href="#rGroupGraphPattern">GroupGraphPattern</a>.
10574
+ It happens before the <a href="#sparqlSimplification">simplification step</a>.
10540
10575
</div>
10541
- <p>@@ rename as ???correllate</p>
10542
10576
</div>
10543
10577
10544
10578
<div class="example">
10545
10579
<p>
10546
10580
Examples
10547
10581
</p>
10548
10582
</div>
10583
+
10584
+ <p>
10585
+ Alternative 2: rewrite the algebra during execution. This corresponds to the
10586
+ <a href="https://github.com/w3c/sparql-dev/blob/main/SEP/SEP-0007/sep-0007.md">original SEP-0007 proposal</a>.
10587
+ </p>
10588
+ <div class="defn">
10589
+ <div>
10590
+ <b>Definition: <span id="defn_valuesinsertion" name="defn_valuesinsertion">Values Insertion</span></b>
10591
+ <p>
10592
+ Define the Values Insertion function `ValuesInsert(X, μ)`
10593
+ </p>
10594
+ <pre>Let Table(μ) = { μ } and multiplicity( μ | Table(μ) = { μ } ) = 1
10595
+
10596
+ Replace each occurence of `Y` in X where `Y` is one of
10597
+ <a href="#sparqlTranslateBasicGraphPatterns">Basic Graph Pattern</a>,
10598
+ <a href="#sparqlTranslatePathExpressions">Property Path Expression</a>,
10599
+ <a href="#sparqlTranslateGraphPatterns">`Graph(Var, pattern)`</a>,
10600
+ <a href="#https://www.w3.org/TR/sparql12-query/#sparqlTranslateGraphPatterns">Inline Data</a>
10601
+ with `join(Y, Table(μ))`.</pre>
10602
+
10603
+ </div>
10604
+ </div>
10549
10605
</section>
10606
+
10550
10607
<section>
10551
10608
<h4>Evaluation of EXISTS</h4>
10552
10609
<div class="defn">
@@ -10556,7 +10613,7 @@ <h4>Evaluation of EXISTS</h4>
10556
10613
define the Evaluation of Exists `exists(X)`
10557
10614
</p>
10558
10615
<pre>exists(X) = true
10559
- if eval( D(G), ValuesInsert (PrjMap(X), μ) )
10616
+ if eval( D(G), ValuesInScope (PrjMap(X)) , μ)
10560
10617
is a non-empty solution sequence.
10561
10618
exists(X) = false otherwise</pre>
10562
10619
</div>
0 commit comments