Skip to content

Commit 930a193

Browse files
authored
Merge pull request #291 from w3c/Issue254
improves definitions of all algebra operators that involve expressions
2 parents 78a901a + a21e493 commit 930a193

File tree

1 file changed

+81
-36
lines changed

1 file changed

+81
-36
lines changed

spec/index.html

Lines changed: 81 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4694,6 +4694,15 @@ <h3>Operand Data Types</h3>
46944694
<section id="expression-evaluation">
46954695
<span id="evaluation"><!-- Legacy name --></span>
46964696
<h3>Expression Evaluation</h3>
4697+
<p>
4698+
A SPARQL expression is evaluated
4699+
with respect to a <a href="#defn_sparqlSolutionMapping">solution mapping</a>
4700+
and in the context of an <a href="#sparqlDataset">RDF dataset</a>
4701+
with an <a href="#defn_ActiveGraph">active graph</a>.
4702+
The result of such an evaluation is either
4703+
an <a data-cite="RDF12-CONCEPTS#dfn-rdf-term">RDF term</a> or
4704+
an [=error=].
4705+
</p>
46974706
<p>
46984707
SPARQL provides a subset of the functions and operators defined by
46994708
<a data-cite="XPATH-FUNCTIONS-31#">XPath and XQuery Functions and Operators</a>.
@@ -10048,16 +10057,18 @@ <h3>SPARQL Algebra</h3>
1004810057
|D| be a <a href="#sparqlDataset">dataset</a>,
1004910058
and |G| be the <a href="#defn_ActiveGraph">active graph</a>.
1005010059
We define:</p>
10051-
<p><a href="#defn_algFilter" class="algFct">Filter</a>(<var>expr</var>, <var>Ω</var>, |D|, |G|) = { <var>μ</var> in <var>Ω</var> | <var>expr</var>(<var>μ</var>) is an expression that has an
10052-
[=effective boolean value=] of true }</p>
10053-
<div class="issue" data-number="254">
10054-
It is not clear what <var>expr</var>(<var>μ</var>) is, and it is not apparent in the formula that the expression |expr| is meant to be evaluated not only with respect to <var>μ</var> but also with respect to |D| with active graph |G|.</div>
10060+
<p><a href="#defn_algFilter" class="algFct">Filter</a>(<var>expr</var>, <var>Ω</var>, |D|, |G|) =
10061+
{ <var>μ</var> in <var>Ω</var> |
10062+
|expr|(<var>μ</var>, |D|, |G|) is an RDF term |t|
10063+
such that <a href="#func-ebv">EBV</a>(|t|) is `"true"^^xsd:boolean` }</p>
1005510064
<p><a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algFilter" class="algFct">Filter</a>(<var>expr</var>, <var>Ω</var>, |D|, |G|) )
1005610065
= <a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <var>Ω</var> )</p>
10057-
<blockquote>
10058-
Note that evaluating an <code>exists(pattern)</code> expression uses the dataset |D| and
10059-
active graph |G|. See the <a href="#defn_evalFilter">evaluation of filter</a>.
10060-
</blockquote>
10066+
<p>
10067+
where, for every solution mapping <var>μ</var>,
10068+
|expr|(<var>μ</var>, |D|, |G|) is the result of
10069+
<a href="#expression-evaluation">evaluating</a> expression |expr|
10070+
with respect to <var>μ</var>, in the context of dataset |D| with active graph |G|.
10071+
</p>
1006110072
</div>
1006210073
<div class="defn">
1006310074
<p><b>Definition: <span id="defn_algJoin">Join</span></b></p>
@@ -10077,29 +10088,46 @@ <h3>SPARQL Algebra</h3>
1007710088
of <var>μ</var> is the sum of the multiplicities from all possibilities.</p>
1007810089
<div class="defn">
1007910090
<p><b>Definition: <span id="defn_algDiff">Diff</span></b></p>
10080-
<p>Let <var>Ω<sub>1</sub></var> and <var>Ω<sub>2</sub></var> be multisets of solution mappings and <var>expr</var> be an
10081-
<a href="#expressions">expression</a>. We define:</p>
10082-
<p><a href="#defn_algDiff" class="algFct">Diff</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>) = { <var>μ</var> | <var>μ</var> in <var>Ω<sub>1</sub></var> such that ∀ <var>μ'</var> in
10083-
<var>Ω<sub>2</sub></var>, either <var>μ</var> and <var>μ'</var> are not <a href="#defn_algCompatibleMapping">compatible</a> or <var>μ</var> and <var>μ'</var> are <a href="#defn_algCompatibleMapping">compatible</a> and
10084-
<var>expr</var>(merge(<var>μ</var>, <var>μ'</var>)) does not have an [=effective boolean value=] of true }</p>
10085-
<div class="issue" data-number="254">
10086-
It is not clear what <var>expr</var>(<var>μ</var>) is, and it is not apparent in the formula that the expression |expr| is meant to be evaluated not only with respect to <var>μ</var> but also with respect to |D| with active graph |G|.</div>
10087-
<p><a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algDiff" class="algFct">Diff</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>) ) =
10091+
<p>Let <var>Ω<sub>1</sub></var> and <var>Ω<sub>2</sub></var> be multisets of solution mappings,
10092+
<var>expr</var> be an <a href="#expressions">expression</a>,
10093+
|D| be a <a href="#sparqlDataset">dataset</a>,
10094+
and |G| be the <a href="#defn_ActiveGraph">active graph</a>.
10095+
We define:</p>
10096+
<p><a href="#defn_algDiff" class="algFct">Diff</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>, |D|, |G|)
10097+
= { <var>μ</var> in <var>Ω<sub>1</sub></var> | for every <var>μ'</var> in <var>Ω<sub>2</sub></var>,
10098+
any of the following conditions holds:</p>
10099+
<ul>
10100+
<li><var>μ</var> and <var>μ'</var> are not <a href="#defn_algCompatibleMapping">compatible</a>,</li>
10101+
<li><var>μ</var> and <var>μ'</var> are <a href="#defn_algCompatibleMapping">compatible</a>
10102+
and |expr|(merge(<var>μ</var>, <var>μ'</var>), |D|, |G|) is an [=error=], or</li>
10103+
<li><var>μ</var> and <var>μ'</var> are <a href="#defn_algCompatibleMapping">compatible</a>
10104+
and |expr|(merge(<var>μ</var>, <var>μ'</var>), |D|, |G|) is an RDF term |t|
10105+
for which <a href="#func-ebv">EBV</a>(|t|) is not `"true"^^xsd:boolean`.</li>
10106+
</ul>
10107+
<p>}</p>
10108+
<p><a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algDiff" class="algFct">Diff</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>, |D|, |G|) ) =
1008810109
<a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <var>Ω<sub>1</sub></var> )</p>
10110+
<p>
10111+
where, for every solution mapping <var>μ</var>,
10112+
|expr|(<var>μ</var>, |D|, |G|) is the result of
10113+
<a href="#expression-evaluation">evaluating</a> expression |expr|
10114+
with respect to <var>μ</var>, in the context of dataset |D| with active graph |G|.
10115+
</p>
1008910116
</div>
10090-
<p>The evaluation of <var>expr</var>(merge(<var>μ</var>, <var>μ'</var>)) does not have an
10091-
[=effective boolean value=] of true if it evaluates to false or if it raises an error.</p>
1009210117
<p><a href="#defn_algDiff" class="algFct">Diff</a> is used internally for the definition of <a href="#defn_algLeftJoin" class="algFct">LeftJoin</a>.</p>
1009310118
<div class="defn">
1009410119
<p><b>Definition: <span id="defn_algLeftJoin">LeftJoin</span></b></p>
10095-
<p>Let <var>Ω<sub>1</sub></var> and <var>Ω<sub>2</sub></var> be multisets of solution mappings and <var>expr</var> be an
10096-
<a href="#expressions">expression</a>. We define:</p>
10097-
<p><a href="#defn_algLeftJoin" class="algFct">LeftJoin</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>) = <a href="#defn_algFilter" class="algFct">Filter</a>(<var>expr</var>, <a href="#defn_algJoin" class="algFct">Join</a>(<var>Ω<sub>1</sub></var>,
10098-
<var>Ω<sub>2</sub></var>)) ∪ <a href="#defn_algDiff" class="algFct">Diff</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>)</p>
10099-
<p><a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algLeftJoin" class="algFct">LeftJoin</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>) ) =
10100-
<a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algFilter" class="algFct">Filter</a>(<var>expr</var>, <a href="#defn_algJoin" class="algFct">Join</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>)) ) +
10120+
<p>Let <var>Ω<sub>1</sub></var> and <var>Ω<sub>2</sub></var> be multisets of solution mappings,
10121+
<var>expr</var> be an <a href="#expressions">expression</a>,
10122+
|D| be a <a href="#sparqlDataset">dataset</a>,
10123+
and |G| be the <a href="#defn_ActiveGraph">active graph</a>.
10124+
We define:</p>
10125+
<p><a href="#defn_algLeftJoin" class="algFct">LeftJoin</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>, |D|, |G|) = <a href="#defn_algFilter" class="algFct">Filter</a>(<var>expr</var>, <a href="#defn_algJoin" class="algFct">Join</a>(<var>Ω<sub>1</sub></var>,
10126+
<var>Ω<sub>2</sub></var>), |D|, |G|) ∪ <a href="#defn_algDiff" class="algFct">Diff</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>, |D|, |G|)</p>
10127+
<p><a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algLeftJoin" class="algFct">LeftJoin</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>, <var>expr</var>, |D|, |G|) ) =
10128+
<a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algFilter" class="algFct">Filter</a>(<var>expr</var>, <a href="#defn_algJoin" class="algFct">Join</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>), |D|, |G|) ) +
1010110129
<a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algDiff" class="algFct">Diff</a>(<var>Ω<sub>1</sub></var>, <var>Ω<sub>2</sub></var>,
10102-
<var>expr</var>) )</p>
10130+
<var>expr</var>, |D|, |G|) )</p>
1010310131
</div>
1010410132

1010510133
<div class="defn">
@@ -10128,14 +10156,28 @@ <h3>SPARQL Algebra</h3>
1012810156
pattern <code>P</code>.</p>
1012910157
<div class="defn">
1013010158
<p><b>Definition: <span id="defn_algExtend">Extend</span><span id="defn_extend"><!-- obsolete id --></span></b></p>
10131-
<p>Let <var>μ</var> be a solution mapping, <var>Ω</var> a multiset of solution mappings, <var>var</var> a variable
10132-
and <var>expr</var> be an <a href="#expressions">expression</a>, then we define:</p>
10133-
<p><a href="#defn_algExtend" class="algFct">Extend</a>(<var>μ</var>, <var>var</var>, <var>expr</var>) = <var>μ</var> ∪ { (<var>var</var>, <var>value</var>) | <var>var</var> not in dom(<var>μ</var>) and <var>value</var> = <var>expr</var>(<var>μ</var>) }</p>
10134-
<div class="issue" data-number="254">
10135-
It is not clear what <var>expr</var>(<var>μ</var>) is, and it is not apparent in the formula that the expression |expr| is meant to be evaluated not only with respect to <var>μ</var> but also with respect to |D| with active graph |G|.</div>
10136-
<p><a href="#defn_algExtend" class="algFct">Extend</a>(<var>μ</var>, <var>var</var>, <var>expr</var>) = <var>μ</var> if <var>var</var> not in dom(<var>μ</var>) and expr(<var>μ</var>) is an error</p>
10137-
<p><a href="#defn_algExtend" class="algFct">Extend</a> is undefined if <var>var</var> in dom(<var>μ</var>).</p>
10138-
<p><a href="#defn_algExtend" class="algFct">Extend</a>(<var>Ω</var>, <var>var</var>, <var>expr</var>) = { <a href="#defn_algExtend" class="algFct">Extend</a>(<var>μ</var>, <var>var</var>, <var>expr</var>) | <var>μ</var> in <var>Ω</var> }</p>
10159+
<p>Let <var>μ</var> be a solution mapping, <var>Ω</var> a multiset of solution mappings,
10160+
<var>var</var> be a variable,
10161+
<var>expr</var> be an <a href="#expressions">expression</a>,
10162+
|D| be a <a href="#sparqlDataset">dataset</a>,
10163+
and |G| be the <a href="#defn_ActiveGraph">active graph</a>.
10164+
We define:</p>
10165+
<p><a href="#defn_algExtend" class="algFct">Extend</a>(<var>Ω</var>, <var>var</var>, <var>expr</var>, |D|, |G|) = { |Extend|(<var>μ</var>, <var>var</var>, <var>expr</var>, |D|, |G|) | <var>μ</var> in <var>Ω</var> },</p>
10166+
<p>where, for every solution mapping <var>μ</var>,</p>
10167+
<p>|Extend|(<var>μ</var>, <var>var</var>, <var>expr</var>, |D|, |G|) = <var>μ</var> ∪ { (<var>var</var>, |expr|(<var>μ</var>, |D|, |G|)) }
10168+
if <var>var</var> not in dom(<var>μ</var>) and
10169+
|expr|(<var>μ</var>, |D|, |G|) is an RDF term,</p>
10170+
<p>|Extend|(<var>μ</var>, <var>var</var>, <var>expr</var>, |D|, |G|) = <var>μ</var>
10171+
if <var>var</var> not in dom(<var>μ</var>) and
10172+
|expr|(<var>μ</var>, |D|, |G|) is an [=error=],</p>
10173+
<p>|Extend|(<var>μ</var>, <var>var</var>, <var>expr</var>, |D|, |G|) is undefined
10174+
if <var>var</var> in dom(<var>μ</var>), and</p>
10175+
<p>|expr|(<var>μ</var>, |D|, |G|) is the result of
10176+
<a href="#expression-evaluation">evaluating</a> expression |expr|
10177+
with respect to <var>μ</var>, in the context of dataset |D| with active graph |G|.
10178+
</p>
10179+
<div class="issue" data-number="290">
10180+
We need to define <a href="#defn_Multiplicity">multiplicity</a>( <var>μ</var> | <a href="#defn_algExtend" class="algFct">Extend</a>(<var>Ω</var>, <var>var</var>, <var>expr</var>, |D|, |G|) )</div>
1013910181
</div>
1014010182
<p>Write [ <var>x</var> | <var>C</var> ] for a sequence of elements where <var>C</var> is a condition on <var>x</var>.</p>
1014110183
<div class="defn">
@@ -10631,7 +10673,7 @@ <h3>Evaluation Semantics</h3>
1063110673
<div class="defn">
1063210674
<p><b>Definition: <span id="defn_evalLeftJoin">Evaluation of LeftJoin</span></b></p>
1063310675
<p>
10634-
<a href="#defn_eval" class="evalFct">eval</a>( |D|(|G|), <a href="#defn_absLeftJoin" class="absOp">LeftJoin</a>(<var>P<sub>1</sub></var>, <var>P<sub>2</sub></var>, |F|) ) = <a href="#defn_algLeftJoin" class="algFct">LeftJoin</a>( <a href="#defn_eval" class="evalFct">eval</a>(|D|(|G|), <var>P<sub>1</sub></var>), <a href="#defn_eval" class="evalFct">eval</a>(|D|(|G|), <var>P<sub>2</sub></var>), |F| )
10676+
<a href="#defn_eval" class="evalFct">eval</a>( |D|(|G|), <a href="#defn_absLeftJoin" class="absOp">LeftJoin</a>(<var>P<sub>1</sub></var>, <var>P<sub>2</sub></var>, |F|) ) = <a href="#defn_algLeftJoin" class="algFct">LeftJoin</a>( <a href="#defn_eval" class="evalFct">eval</a>(|D|(|G|), <var>P<sub>1</sub></var>), <a href="#defn_eval" class="evalFct">eval</a>(|D|(|G|), <var>P<sub>2</sub></var>), |F|, |D|, |G| )
1063510677
</p>
1063610678
</div>
1063710679
<div class="defn">
@@ -10702,9 +10744,9 @@ <h3>Evaluation Semantics</h3>
1070210744
</div>
1070310745
<p>Note that if <a href="#defn_eval" class="evalFct">eval</a>(|D|(|G|), <var>A<sub>i</sub></var>) is an error, it is ignored.</p>
1070410746
<div class="defn">
10705-
<p><b>Definition: <span id="defn_evalExtend">Evaluation of <a href="#defn_absExtend" class="absOp">Extend</a></span></b></p>
10747+
<p><b>Definition: <span id="defn_evalExtend">Evaluation of Extend</span></b></p>
1070610748
<p>
10707-
<a href="#defn_eval" class="evalFct">eval</a>( |D|(|G|), <a href="#defn_absExtend" class="absOp">Extend</a>(|P|, |var|, |expr|) ) = <a href="#defn_algExtend" class="algFct">Extend</a>( <a href="#defn_eval" class="evalFct">eval</a>(|D|(|G|), |P|), |var|, |expr| )
10749+
<a href="#defn_eval" class="evalFct">eval</a>( |D|(|G|), <a href="#defn_absExtend" class="absOp">Extend</a>(|P|, |var|, |expr|) ) = <a href="#defn_algExtend" class="algFct">Extend</a>( <a href="#defn_eval" class="evalFct">eval</a>(|D|(|G|), |P|), |var|, |expr|, |D|, |G| )
1070810750
</p>
1070910751
</div>
1071010752
<div class="defn">
@@ -12652,6 +12694,9 @@ <h2>Changes between SPARQL 1.1 Query Language and SPARQL 1.2 Query Language</h2>
1265212694
from <i>eval</i> to <i>reachableTerms</i>.</li>
1265312695
<li>Add section <a href="#sparql-error" class="sectionRef"></a> about SPARQL expression evaluation errors</a>.</li>
1265412696
<li>Rename section "Filter evaluation" as <a href="#expression-evaluation" class="sectionRef"></a>.</li>
12697+
<li>Improve definitions of all algebra operators that involve expressions
12698+
(<a href="#defn_algFilter" class="algFct">Filter</a>, <a href="#defn_algDiff" class="algFct">Diff</a>,
12699+
<a href="#defn_algLeftJoin" class="algFct">LeftJoin</a>, and <a href="#defn_algExtend" class="algFct">Extend</a>).</li>
1265512700
</ul>
1265612701
</li>
1265712702
<li>

0 commit comments

Comments
 (0)