Author: buildbot
Date: Mon Nov 4 09:37:07 2013
New Revision: 885381
Log:
Staging update by buildbot for jena
Modified:
websites/staging/jena/trunk/content/ (props changed)
websites/staging/jena/trunk/content/documentation/query/negation.html
Propchange: websites/staging/jena/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Mon Nov 4 09:37:07 2013
@@ -1 +1 @@
-1537713
+1538538
Modified: websites/staging/jena/trunk/content/documentation/query/negation.html
==============================================================================
--- websites/staging/jena/trunk/content/documentation/query/negation.html
(original)
+++ websites/staging/jena/trunk/content/documentation/query/negation.html Mon
Nov 4 09:37:07 2013
@@ -127,31 +127,37 @@
<div class="col-md-12">
<div id="breadcrumbs"></div>
<h1 class="title">ARQ - Negation</h1>
- <p>Standard SPARQL 1.0 can perform negation using the idiom of
+ <h3 id="negation-by-failure-optional-bound">Negation by Failure (OPTIONAL +
!BOUND)</h3>
+<p>Standard SPARQL 1.0 can perform negation using the idiom of
<code>OPTIONAL</code>/<code>!BOUND</code>. It is inconvenient and can be hard
to use as
complexity increases. SPARQL 1.1 supports additional operators for
negation.</p>
-<p>The <code>EXISTS</code> and <code>NOT EXISTS</code> are now legal SPARQL
1.1 when used inside a <code>FILTER</code>,
-they may be used as bare graph patterns only when
<code>Syntax.syntaxARQ</code> is used</p>
<div class="codehilite"><pre><span class="c"># Names of people who have not
stated that they know anyone</span>
<span class="n">PREFIX</span> <span class="n">foaf</span><span
class="p">:</span> <span class="o"><</span><span class="n">http</span><span
class="p">:</span><span class="o">//</span><span class="n">xmlns</span><span
class="p">.</span><span class="n">com</span><span class="o">/</span><span
class="n">foaf</span><span class="o">/</span>0<span class="p">.</span>1<span
class="o">/></span>
<span class="n">SELECT</span> ?<span class="n">name</span>
-<span class="n">WHERE</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">givenName</span> ?<span class="n">name</span> <span
class="p">.</span>
- <span class="n">OPTIONAL</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">knows</span> ?<span class="nb">who</span> <span class="p">}</span>
<span class="p">.</span>
- <span class="n">FILTER</span> <span class="p">(</span><span
class="o">!</span><span class="n">BOUND</span><span class="p">(</span>?<span
class="nb">who</span><span class="p">))</span>
+<span class="n">WHERE</span>
+<span class="p">{</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">givenName</span> ?<span
class="n">name</span> <span class="p">.</span>
+ <span class="n">OPTIONAL</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">knows</span> ?<span class="nb">who</span> <span class="p">}</span>
<span class="p">.</span>
+ <span class="n">FILTER</span> <span class="p">(</span><span
class="o">!</span><span class="n">BOUND</span><span class="p">(</span>?<span
class="nb">who</span><span class="p">))</span>
<span class="p">}</span>
</pre></div>
+<h3 id="exists-and-not-exists">EXISTS and NOT EXISTS</h3>
+<p>The <code>EXISTS</code> and <code>NOT EXISTS</code> are now legal SPARQL
1.1 when used inside a <code>FILTER</code>,
+they may be used as bare graph patterns only when
<code>Syntax.syntaxARQ</code> is used</p>
<p>There is the <code>NOT EXISTS</code> operator which acts at the point in
the query where it is
-written. It does not bind any variables but variables aready boudn
+written. It does not bind any variables but variables aready bound
in the query will have their bound value.</p>
<div class="codehilite"><pre><span class="c"># Names of people who have not
stated that they know anyone</span>
<span class="n">PREFIX</span> <span class="n">foaf</span><span
class="p">:</span> <span class="o"><</span><span class="n">http</span><span
class="p">:</span><span class="o">//</span><span class="n">xmlns</span><span
class="p">.</span><span class="n">com</span><span class="o">/</span><span
class="n">foaf</span><span class="o">/</span>0<span class="p">.</span>1<span
class="o">/></span>
<span class="n">SELECT</span> ?<span class="n">name</span>
-<span class="n">WHERE</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">givenName</span> ?<span class="n">name</span> <span class="p">.</span>
- <span class="n">FILTER</span> <span class="n">NOT</span> <span
class="n">EXISTS</span> <span class="p">{</span> ?<span class="n">x</span>
<span class="n">foaf</span><span class="p">:</span><span class="n">knows</span>
?<span class="nb">who</span> <span class="p">}</span>
- <span class="p">}</span>
+<span class="n">WHERE</span>
+<span class="p">{</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">givenName</span> ?<span class="n">name</span>
<span class="p">.</span>
+ <span class="n">FILTER</span> <span class="n">NOT</span> <span
class="n">EXISTS</span> <span class="p">{</span> ?<span class="n">x</span>
<span class="n">foaf</span><span class="p">:</span><span class="n">knows</span>
?<span class="nb">who</span> <span class="p">}</span>
+<span class="p">}</span>
</pre></div>
@@ -159,9 +165,11 @@ in the query will have their bound value
<div class="codehilite"><pre><span class="c"># Names of people where it is
stated that they know at least one other person.</span>
<span class="n">PREFIX</span> <span class="n">foaf</span><span
class="p">:</span> <span class="o"><</span><span class="n">http</span><span
class="p">:</span><span class="o">//</span><span class="n">xmlns</span><span
class="p">.</span><span class="n">com</span><span class="o">/</span><span
class="n">foaf</span><span class="o">/</span>0<span class="p">.</span>1<span
class="o">/></span>
<span class="n">SELECT</span> ?<span class="n">name</span>
-<span class="n">WHERE</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">givenName</span> ?<span class="n">name</span> <span class="p">.</span>
- <span class="n">FILTER</span> <span class="n">EXISTS</span> <span
class="p">{</span> ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="nb">who</span>
<span class="p">.</span> <span class="n">FILTER</span><span
class="p">(</span>?<span class="nb">who</span> <span class="o">!=</span> ?<span
class="n">x</span><span class="p">)</span> <span class="p">}</span>
- <span class="p">}</span>
+<span class="n">WHERE</span>
+<span class="p">{</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">givenName</span> ?<span class="n">name</span>
<span class="p">.</span>
+ <span class="n">FILTER</span> <span class="n">EXISTS</span> <span
class="p">{</span> ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="nb">who</span>
<span class="p">.</span> <span class="n">FILTER</span><span
class="p">(</span>?<span class="nb">who</span> <span class="o">!=</span> ?<span
class="n">x</span><span class="p">)</span> <span class="p">}</span>
+<span class="p">}</span>
</pre></div>
@@ -174,19 +182,23 @@ graph pattern in which they occur.</p>
<div class="codehilite"><pre><span class="c"># Names of people who have not
stated that they know anyone</span>
<span class="n">PREFIX</span> <span class="n">foaf</span><span
class="p">:</span> <span class="o"><</span><span class="n">http</span><span
class="p">:</span><span class="o">//</span><span class="n">xmlns</span><span
class="p">.</span><span class="n">com</span><span class="o">/</span><span
class="n">foaf</span><span class="o">/</span>0<span class="p">.</span>1<span
class="o">/></span>
<span class="n">SELECT</span> ?<span class="n">name</span>
-<span class="n">WHERE</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">givenName</span> ?<span class="n">name</span> <span class="p">.</span>
- <span class="n">FILTER</span> <span class="p">(</span><span
class="n">NOT</span> <span class="n">EXISTS</span> <span class="p">{</span>
?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="nb">who</span>
<span class="p">})</span>
- <span class="p">}</span>
+<span class="n">WHERE</span>
+<span class="p">{</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">givenName</span> ?<span class="n">name</span>
<span class="p">.</span>
+ <span class="n">FILTER</span> <span class="p">(</span><span
class="n">NOT</span> <span class="n">EXISTS</span> <span class="p">{</span>
?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="nb">who</span>
<span class="p">})</span>
+ <span class="p">}</span>
</pre></div>
<p>A note of caution:</p>
<div class="codehilite"><pre><span class="n">PREFIX</span> <span
class="n">foaf</span><span class="p">:</span> <span class="o"><</span><span
class="n">http</span><span class="p">:</span><span class="o">//</span><span
class="n">xmlns</span><span class="p">.</span><span class="n">com</span><span
class="o">/</span><span class="n">foaf</span><span class="o">/</span>0<span
class="p">.</span>1<span class="o">/></span>
<span class="n">SELECT</span> ?<span class="n">name</span>
-<span class="n">WHERE</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">givenName</span> ?<span class="n">name</span> <span class="p">.</span>
- <span class="n">FILTER</span> <span class="p">(</span><span
class="n">NOT</span> <span class="n">EXISTS</span> <span class="p">{</span>
?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">y</span> <span
class="p">})</span>
- ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">who</span>
- <span class="p">}</span>
+<span class="n">WHERE</span>
+<span class="p">{</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">givenName</span> ?<span class="n">name</span>
<span class="p">.</span>
+ <span class="n">FILTER</span> <span class="p">(</span><span
class="n">NOT</span> <span class="n">EXISTS</span> <span class="p">{</span>
?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">y</span> <span
class="p">})</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">who</span>
+<span class="p">}</span>
</pre></div>
@@ -194,16 +206,53 @@ graph pattern in which they occur.</p>
not break it in two):</p>
<div class="codehilite"><pre><span class="n">PREFIX</span> <span
class="n">foaf</span><span class="p">:</span> <span class="o"><</span><span
class="n">http</span><span class="p">:</span><span class="o">//</span><span
class="n">xmlns</span><span class="p">.</span><span class="n">com</span><span
class="o">/</span><span class="n">foaf</span><span class="o">/</span>0<span
class="p">.</span>1<span class="o">/></span>
<span class="n">SELECT</span> ?<span class="n">name</span>
-<span class="n">WHERE</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">givenName</span> ?<span class="n">name</span> <span class="p">.</span>
- ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">y</span> <span
class="p">.</span>
- <span class="n">FILTER</span> <span class="p">(</span><span
class="n">NOT</span> <span class="n">EXISTS</span> <span class="p">{</span>
?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">who</span>
<span class="p">})</span>
- <span class="p">}</span>
+<span class="n">WHERE</span>
+<span class="p">{</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">givenName</span> ?<span class="n">name</span>
<span class="p">.</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">y</span> <span
class="p">.</span>
+ <span class="n">FILTER</span> <span class="p">(</span><span
class="n">NOT</span> <span class="n">EXISTS</span> <span class="p">{</span>
?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">who</span>
<span class="p">})</span>
+<span class="p">}</span>
</pre></div>
<p>and the <code>FILTER</code> will always be false (<code>{ ?x foaf:knows ?y
}</code> must
-have matched to get to this point in the query and useing ?who
+have matched to get to this point in the query and using <code>?who</code>
instead makes no difference).</p>
+<h3 id="minus">MINUS</h3>
+<p>SPARQL 1.1 also provides a <code>MINUS</code> keyword which is broadly
similar to
+<code>NOT EXISTS</code> though does have some key differences as explained in
the <a
href="http://www.w3.org/TR/sparql11-query/#neg-notexists-minus">specification</a>:</p>
+<div class="codehilite"><pre><span class="n">PREFIX</span> <span
class="n">foaf</span><span class="p">:</span> <span class="o"><</span><span
class="n">http</span><span class="p">:</span><span class="o">//</span><span
class="n">xmlns</span><span class="p">.</span><span class="n">com</span><span
class="o">/</span><span class="n">foaf</span><span class="o">/</span>0<span
class="p">.</span>1<span class="o">/></span>
+<span class="n">SELECT</span> ?<span class="n">name</span>
+<span class="n">WHERE</span>
+<span class="p">{</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">givenName</span> ?<span class="n">name</span>
<span class="p">.</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">y</span> <span
class="p">.</span>
+ <span class="n">MINUS</span> <span class="p">{</span> ?<span
class="n">x</span> <span class="n">foaf</span><span class="p">:</span><span
class="n">knows</span> <span class="o"><</span><span
class="n">http</span><span class="p">:</span><span class="o">//</span><span
class="n">example</span><span class="p">.</span><span class="n">org</span><span
class="o">/</span><span class="n">A</span><span class="o">></span> <span
class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>Here we subtract any solutions where <code>?x</code> also knows
<code>http://example.org/A</code></p>
+<p>One of the key differences between <code>MINUS</code> and <code>NOT
EXISTS</code> is that it is a child graph pattern and so breaks
+the graph pattern and so the result of the query can change depending where
the <code>MINUS</code> is placed. This is
+unlike the earlier <code>NOT EXISTS</code> examples where moving the position
of the <code>FILTER</code> resulted
+in equivalent queries.</p>
+<h3 id="not-in">NOT IN</h3>
+<p>SPARQL 1.1 also has a simpler form of negation for when you simply
+need to restrict a variable to not being in a given set of values, this is the
+<code>NOT IN</code> function:</p>
+<div class="codehilite"><pre><span class="n">PREFIX</span> <span
class="n">foaf</span><span class="p">:</span> <span class="o"><</span><span
class="n">http</span><span class="p">:</span><span class="o">//</span><span
class="n">xmlns</span><span class="p">.</span><span class="n">com</span><span
class="o">/</span><span class="n">foaf</span><span class="o">/</span>0<span
class="p">.</span>1<span class="o">/></span>
+<span class="n">SELECT</span> ?<span class="n">name</span>
+<span class="n">WHERE</span>
+<span class="p">{</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">givenName</span> ?<span class="n">name</span>
<span class="p">.</span>
+ ?<span class="n">x</span> <span class="n">foaf</span><span
class="p">:</span><span class="n">knows</span> ?<span class="n">y</span> <span
class="p">.</span>
+ <span class="n">FILTER</span><span class="p">(</span>?<span
class="n">y</span> <span class="n">NOT</span> <span class="n">IN</span> <span
class="p">(</span><span class="o"><</span><span class="n">http</span><span
class="p">:</span><span class="o">//</span><span class="n">example</span><span
class="p">.</span><span class="n">org</span><span class="o">/</span><span
class="n">A</span><span class="o">></span><span class="p">,</span> <span
class="o"><</span><span class="n">http</span><span class="p">:</span><span
class="o">//</span><span class="n">example</span><span class="p">.</span><span
class="n">org</span><span class="o">/</span><span class="n">B</span><span
class="o">></span><span class="p">))</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>This would filter out matches where the value of <code>?y</code> is either
<code>http://example.org/A</code> or <code>http://example.org/B</code> </p>
<p><a href="index.html">ARQ documentation index</a></p>
</div>
</div>