You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by bu...@apache.org on 2013/06/20 12:18:36 UTC
svn commit: r866584 [9/21] - in /websites/staging/jena/trunk/content: ./
documentation/assembler/ documentation/inference/ documentation/io/
documentation/javadoc/arq/ documentation/javadoc/fuseki/
documentation/javadoc/jena/ documentation/javadoc/larq...
Modified: websites/staging/jena/trunk/content/documentation/query/manipulating_sparql_using_arq.html
==============================================================================
--- websites/staging/jena/trunk/content/documentation/query/manipulating_sparql_using_arq.html (original)
+++ websites/staging/jena/trunk/content/documentation/query/manipulating_sparql_using_arq.html Thu Jun 20 10:18:34 2013
@@ -169,16 +169,16 @@ blog</a></em></p>
<h2 id="inserting-values-simple-prepared-statements">Inserting values (simple prepared statements)</h2>
<p>Let's begin with something simple. Suppose we wanted to restrict the
following query to a particular person:</p>
-<div class="codehilite"><pre> <span class="nb">select</span> <span class="o">*</span> <span class="p">{</span><span class="err">Â </span><span class="p">?</span><span class="n">person</span> <span class="sr"><http://xmlns.com/foaf/0.1/name></span><span class="err">Â </span><span class="p">?</span><span class="n">name</span> <span class="p">}</span>
+<div class="codehilite"><pre> <span class="n">select</span> <span class="o">*</span> <span class="p">{</span>Â ?<span class="n">person</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">name</span><span class="o">></span>Â ?<span class="n">name</span> <span class="p">}</span>
</pre></div>
<p><code>String#replaceAll</code> would work, but there is a safer way.
<code>QueryExecutionFactory</code> in most cases lets you supply a <code>QuerySolution</code>
with which you can prebind values.</p>
-<div class="codehilite"><pre> <span class="n">QuerySolutionMap</span> <span class="n">initialBinding</span> <span class="o">=</span> <span class="k">new</span> <span class="n">QuerySolutionMap</span><span class="p">();</span>
- <span class="n">initialBinding</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="n">personResource</span><span class="p">);</span>
- <span class="n">qe</span> <span class="o">=</span> <span class="n">QueryExecutionFactory</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">initialBinding</span><span class="p">);</span>
+<div class="codehilite"><pre> <span class="n">QuerySolutionMap</span> <span class="n">initialBinding</span> <span class="p">=</span> <span class="n">new</span> <span class="n">QuerySolutionMap</span><span class="p">();</span>
+ <span class="n">initialBinding</span><span class="p">.</span><span class="n">add</span><span class="p">(</span>"<span class="n">name</span>"<span class="p">,</span> <span class="n">personResource</span><span class="p">);</span>
+ <span class="n">qe</span> <span class="p">=</span> <span class="n">QueryExecutionFactory</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">initialBinding</span><span class="p">);</span>
</pre></div>
@@ -193,24 +193,24 @@ query. So what how do we really alter qu
<p>ARQ provides two ways to work with queries: at the syntax level (<code>Query</code>
and <code>Element</code>), or the algebra level (<code>Op</code>). The distinction is clear in
filters:</p>
-<div class="codehilite"><pre> <span class="n">SELECT</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="p">{</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><http://example.com/val></span><span class="err">Â </span><span class="p">?</span><span class="n">val</span> <span class="o">.</span> <span class="n">FILTER</span> <span class="p">(</span><span class="err">Â </span><span class="p">?</span><span class="n">val</span> <span class="o"><</span> <span class="mi">20</span> <span class="p">)</span> <span class="p">}</span>
+<div class="codehilite"><pre> <span class="n">SELECT</span>Â ?<span class="n">s</span> <span class="p">{</span>Â ?<span class="n">s</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">com</span><span class="o">/</span><span class="n">val</span><span class="o">></span>Â ?<span class="n">val</span> <span class="p">.</span> <span class="n">FILTER</span> <span class="p">(</span>Â ?<span class="n">val</span> <span class="o"><</span> 20 <span class="p">)</span> <span class="p">}</span>
</pre></div>
<p>If you work at the syntax level you'll find that this looks (in pseudo
code) like:</p>
-<div class="codehilite"><pre> <span class="p">(</span><span class="n">GROUP</span> <span class="p">(</span><span class="n">PATTERN</span> <span class="p">(</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><http://example.com/val></span><span class="err">Â </span><span class="p">?</span><span class="n">val</span> <span class="p">))</span> <span class="p">(</span><span class="n">FILTER</span> <span class="p">(</span> <span class="o"><</span><span class="err">Â </span><span class="p">?</span><span class="n">val</span> <span class="mi">20</span> <span class="p">)</span> <span class="p">))</span>
+<div class="codehilite"><pre> <span class="p">(</span><span class="n">GROUP</span> <span class="p">(</span><span class="n">PATTERN</span> <span class="p">(</span>Â ?<span class="n">s</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">com</span><span class="o">/</span><span class="n">val</span><span class="o">></span>Â ?<span class="n">val</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">val</span> 20 <span class="p">)</span> <span class="p">))</span>
</pre></div>
<p>That is there's a group containing a triple pattern and a filter, just
as you see in the query. The algebra is different, and we can see it
using <code>arq.qparse --print op</code></p>
-<div class="codehilite"><pre> <span class="nv">$</span> <span class="nv">java</span> <span class="n">arq</span><span class="o">.</span><span class="n">qparse</span> <span class="o">--</span><span class="k">print</span> <span class="n">op</span> <span class="s">'SELECTÂ ?s {Â ?s <http://example.com/val>Â ?val . FILTER (Â ?val < 20 ) }'</span>
- <span class="p">(</span><span class="n">base</span> <span class="sr"><file:///...></span>
- <span class="p">(</span><span class="n">project</span> <span class="p">(?</span><span class="n">s</span><span class="p">)</span>
- <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span><span class="err">Â </span><span class="p">?</span><span class="n">val</span> <span class="mi">20</span><span class="p">)</span>
- <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><http://example.com/val></span><span class="err">Â </span><span class="p">?</span><span class="n">val</span><span class="p">)))))</span>
+<div class="codehilite"><pre> $ <span class="n">java</span> <span class="n">arq</span><span class="p">.</span><span class="n">qparse</span> <span class="o">--</span><span class="n">print</span> <span class="n">op</span> <span class="s">'SELECTÂ ?s {Â ?s <http://example.com/val>Â ?val . FILTER (Â ?val < 20 ) }'</span>
+ <span class="p">(</span><span class="n">base</span> <span class="o"><</span><span class="n">file</span><span class="p">:</span><span class="o">///</span><span class="p">...</span><span class="o">></span>
+ <span class="p">(</span><span class="n">project</span> <span class="p">(</span>?<span class="n">s</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">val</span> 20<span class="p">)</span>
+ <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span>Â ?<span class="n">s</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">com</span><span class="o">/</span><span class="n">val</span><span class="o">></span>Â ?<span class="n">val</span><span class="p">)))))</span>
</pre></div>
@@ -218,11 +218,11 @@ using <code>arq.qparse --print op</code>
This form makes it clear that the expression is filtering the pattern.</p>
<p>Let's create that query from scratch using ARQ. We begin with some
common pieces: the triple to match, and the expression for the filter.</p>
-<div class="codehilite"><pre> <span class="sr">//</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span><span class="err">Â </span><span class="p">?</span><span class="n">p</span><span class="err">Â </span><span class="p">?</span><span class="n">o</span> <span class="o">.</span>
- <span class="n">Triple</span> <span class="n">pattern</span> <span class="o">=</span>
- <span class="n">Triple</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">Var</span><span class="o">.</span><span class="n">alloc</span><span class="p">(</span><span class="s">"s"</span><span class="p">),</span> <span class="n">Var</span><span class="o">.</span><span class="n">alloc</span><span class="p">(</span><span class="s">"p"</span><span class="p">),</span> <span class="n">Var</span><span class="o">.</span><span class="n">alloc</span><span class="p">(</span><span class="s">"o"</span><span class="p">));</span>
- <span class="sr">//</span> <span class="p">(</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="o"><</span> <span class="mi">20</span> <span class="p">)</span>
- <span class="n">Expr</span> <span class="n">e</span> <span class="o">=</span> <span class="k">new</span> <span class="n">E_LessThan</span><span class="p">(</span><span class="k">new</span> <span class="n">ExprVar</span><span class="p">(</span><span class="s">"s"</span><span class="p">),</span> <span class="k">new</span> <span class="n">NodeValueInteger</span><span class="p">(</span><span class="mi">20</span><span class="p">));</span>
+<div class="codehilite"><pre> <span class="o">//</span>Â ?<span class="n">s</span>Â ?<span class="n">p</span>Â ?<span class="n">o</span> <span class="p">.</span>
+ <span class="n">Triple</span> <span class="n">pattern</span> <span class="p">=</span>
+ <span class="n">Triple</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">Var</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span>"<span class="n">s</span>"<span class="p">),</span> <span class="n">Var</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span>"<span class="n">p</span>"<span class="p">),</span> <span class="n">Var</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span>"<span class="n">o</span>"<span class="p">));</span>
+ <span class="o">//</span> <span class="p">(</span>Â ?<span class="n">s</span> <span class="o"><</span> 20 <span class="p">)</span>
+ <span class="n">Expr</span> <span class="n">e</span> <span class="p">=</span> <span class="n">new</span> <span class="n">E_LessThan</span><span class="p">(</span><span class="n">new</span> <span class="n">ExprVar</span><span class="p">(</span>"<span class="n">s</span>"<span class="p">),</span> <span class="n">new</span> <span class="n">NodeValueInteger</span><span class="p">(</span>20<span class="p">));</span>
</pre></div>
@@ -230,29 +230,29 @@ common pieces: the triple to match, and
for variables. <code>Expr</code> is the root interface for expressions, those
things that appear in <code>FILTER</code> and <code>LET</code>.</p>
<p>First the syntax route:</p>
-<div class="codehilite"><pre> <span class="n">ElementTriplesBlock</span> <span class="n">block</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ElementTriplesBlock</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">BGP</span>
- <span class="n">block</span><span class="o">.</span><span class="n">addTriple</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Add</span> <span class="k">our</span> <span class="n">pattern</span> <span class="n">match</span>
- <span class="n">ElementFilter</span> <span class="n">filter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ElementFilter</span><span class="p">(</span><span class="n">e</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">filter</span> <span class="n">matching</span> <span class="n">the</span> <span class="n">expression</span>
- <span class="n">ElementGroup</span> <span class="n">body</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ElementGroup</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Group</span> <span class="k">our</span> <span class="n">pattern</span> <span class="n">match</span> <span class="ow">and</span> <span class="n">filter</span>
- <span class="n">body</span><span class="o">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">block</span><span class="p">);</span>
- <span class="n">body</span><span class="o">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">filter</span><span class="p">);</span>
-
- <span class="n">Query</span> <span class="sx">q = </span><span class="n">QueryFactory</span><span class="o">.</span><span class="n">make</span><span class="p">();</span>
- <span class="sx">q.setQueryPattern(body); // Set the body of the query to our group</span>
-<span class="sx"> q.</span><span class="n">setQuerySelectType</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">it</span> <span class="n">a</span> <span class="nb">select</span> <span class="n">query</span>
- <span class="n">q</span><span class="o">.</span><span class="n">addResultVar</span><span class="p">(</span><span class="s">"s"</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Select</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span>
+<div class="codehilite"><pre> <span class="n">ElementTriplesBlock</span> <span class="n">block</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ElementTriplesBlock</span><span class="p">();</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">BGP</span>
+ <span class="n">block</span><span class="p">.</span><span class="n">addTriple</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span> <span class="o">//</span> <span class="n">Add</span> <span class="n">our</span> <span class="n">pattern</span> <span class="n">match</span>
+ <span class="n">ElementFilter</span> <span class="n">filter</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ElementFilter</span><span class="p">(</span><span class="n">e</span><span class="p">);</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">filter</span> <span class="n">matching</span> <span class="n">the</span> <span class="n">expression</span>
+ <span class="n">ElementGroup</span> <span class="n">body</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ElementGroup</span><span class="p">();</span> <span class="o">//</span> <span class="n">Group</span> <span class="n">our</span> <span class="n">pattern</span> <span class="n">match</span> <span class="n">and</span> <span class="n">filter</span>
+ <span class="n">body</span><span class="p">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">block</span><span class="p">);</span>
+ <span class="n">body</span><span class="p">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">filter</span><span class="p">);</span>
+
+ <span class="n">Query</span> <span class="n">q</span> <span class="p">=</span> <span class="n">QueryFactory</span><span class="p">.</span><span class="n">make</span><span class="p">();</span>
+ <span class="n">q</span><span class="p">.</span><span class="n">setQueryPattern</span><span class="p">(</span><span class="n">body</span><span class="p">);</span> <span class="o">//</span> <span class="n">Set</span> <span class="n">the</span> <span class="n">body</span> <span class="n">of</span> <span class="n">the</span> <span class="n">query</span> <span class="n">to</span> <span class="n">our</span> <span class="n">group</span>
+ <span class="n">q</span><span class="p">.</span><span class="n">setQuerySelectType</span><span class="p">();</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">it</span> <span class="n">a</span> <span class="n">select</span> <span class="n">query</span>
+ <span class="n">q</span><span class="p">.</span><span class="n">addResultVar</span><span class="p">(</span>"<span class="n">s</span>"<span class="p">);</span> <span class="o">//</span> <span class="n">Select</span>Â ?<span class="n">s</span>
</pre></div>
<p>Now the algebra:</p>
<div class="codehilite"><pre> <span class="n">Op</span> <span class="n">op</span><span class="p">;</span>
- <span class="n">BasicPattern</span> <span class="n">pat</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BasicPattern</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">pattern</span>
- <span class="n">pat</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Add</span> <span class="k">our</span> <span class="n">pattern</span> <span class="n">match</span>
- <span class="n">op</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OpBGP</span><span class="p">(</span><span class="n">pat</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">BGP</span> <span class="n">from</span> <span class="n">this</span> <span class="n">pattern</span>
- <span class="n">op</span> <span class="o">=</span> <span class="n">OpFilter</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">op</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Filter</span> <span class="n">that</span> <span class="n">pattern</span> <span class="n">with</span> <span class="k">our</span> <span class="n">expression</span>
- <span class="n">op</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OpProject</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">Arrays</span><span class="o">.</span><span class="n">asList</span><span class="p">(</span><span class="n">Var</span><span class="o">.</span><span class="n">alloc</span><span class="p">(</span><span class="s">"s"</span><span class="p">)));</span> <span class="sr">//</span> <span class="n">Reduce</span> <span class="n">to</span> <span class="n">just</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span>
- <span class="n">Query</span> <span class="sx">q = </span><span class="n">OpAsQuery</span><span class="o">.</span><span class="n">asQuery</span><span class="p">(</span><span class="n">op</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Convert</span> <span class="n">to</span> <span class="n">a</span> <span class="n">query</span>
- <span class="n">q</span><span class="o">.</span><span class="n">setQuerySelectType</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">is</span> <span class="n">a</span> <span class="nb">select</span> <span class="n">query</span>
+ <span class="n">BasicPattern</span> <span class="n">pat</span> <span class="p">=</span> <span class="n">new</span> <span class="n">BasicPattern</span><span class="p">();</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">pattern</span>
+ <span class="n">pat</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span> <span class="o">//</span> <span class="n">Add</span> <span class="n">our</span> <span class="n">pattern</span> <span class="n">match</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">new</span> <span class="n">OpBGP</span><span class="p">(</span><span class="n">pat</span><span class="p">);</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">BGP</span> <span class="n">from</span> <span class="n">this</span> <span class="n">pattern</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">OpFilter</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">op</span><span class="p">);</span> <span class="o">//</span> <span class="n">Filter</span> <span class="n">that</span> <span class="n">pattern</span> <span class="n">with</span> <span class="n">our</span> <span class="n">expression</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">new</span> <span class="n">OpProject</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">Arrays</span><span class="p">.</span><span class="n">asList</span><span class="p">(</span><span class="n">Var</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span>"<span class="n">s</span>"<span class="p">)));</span> <span class="o">//</span> <span class="n">Reduce</span> <span class="n">to</span> <span class="n">just</span>Â ?<span class="n">s</span>
+ <span class="n">Query</span> <span class="n">q</span> <span class="p">=</span> <span class="n">OpAsQuery</span><span class="p">.</span><span class="n">asQuery</span><span class="p">(</span><span class="n">op</span><span class="p">);</span> <span class="o">//</span> <span class="n">Convert</span> <span class="n">to</span> <span class="n">a</span> <span class="n">query</span>
+ <span class="n">q</span><span class="p">.</span><span class="n">setQuerySelectType</span><span class="p">();</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">is</span> <span class="n">a</span> <span class="n">select</span> <span class="n">query</span>
</pre></div>
@@ -278,19 +278,19 @@ simplify and optimise query execution.</
<p>In Research Revealed I wrote some code to take a number of constraints
and produce a query. There were a number of ways to do this, but one way
I found was to generate ops from each constraint and join the results:</p>
-<div class="codehilite"><pre> <span class="k">for</span> <span class="p">(</span><span class="n">Constraint</span> <span class="n">con:</span> <span class="n">cons</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">op</span> <span class="o">=</span> <span class="n">OpJoin</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">consToOp</span><span class="p">(</span><span class="n">cons</span><span class="p">));</span> <span class="sr">//</span> <span class="nb">join</span>
+<div class="codehilite"><pre> <span class="k">for</span> <span class="p">(</span><span class="n">Constraint</span> <span class="n">con</span><span class="p">:</span> <span class="n">cons</span><span class="p">)</span> <span class="p">{</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">OpJoin</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">consToOp</span><span class="p">(</span><span class="n">cons</span><span class="p">));</span> <span class="o">//</span> <span class="n">join</span>
<span class="p">}</span>
</pre></div>
<p>The result was a perfectly correct mess, which is only barely readable
with just three conditions:</p>
-<div class="codehilite"><pre> <span class="p">(</span><span class="nb">join</span>
- <span class="p">(</span><span class="nb">join</span>
- <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span><span class="err">Â </span><span class="p">?</span><span class="n">o0</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop0></span><span class="err">Â </span><span class="p">?</span><span class="n">o0</span><span class="p">)))</span>
- <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span><span class="err">Â </span><span class="p">?</span><span class="n">o1</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop1></span><span class="err">Â </span><span class="p">?</span><span class="n">o1</span><span class="p">))))</span>
- <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span><span class="err">Â </span><span class="p">?</span><span class="n">o2</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop2></span><span class="err">Â </span><span class="p">?</span><span class="n">o2</span><span class="p">))))</span>
+<div class="codehilite"><pre> <span class="p">(</span><span class="n">join</span>
+ <span class="p">(</span><span class="n">join</span>
+ <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span>Â ?<span class="n">o0</span> 20<span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span>Â ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop0</span><span class="o">></span>Â ?<span class="n">o0</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">o1</span> 20<span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span>Â ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop1</span><span class="o">></span>Â ?<span class="n">o1</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">o2</span> 20<span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span>Â ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop2</span><span class="o">></span>Â ?<span class="n">o2</span><span class="p">))))</span>
</pre></div>
@@ -299,27 +299,27 @@ readable by moving the filters out, and
can do this with the following <code>Transform</code>:</p>
<div class="codehilite"><pre> <span class="n">class</span> <span class="n">QueryCleaner</span> <span class="n">extends</span> <span class="n">TransformBase</span>
<span class="p">{</span>
- <span class="nv">@Override</span>
- <span class="n">public</span> <span class="n">Op</span> <span class="n">transform</span><span class="p">(</span><span class="n">OpJoin</span> <span class="nb">join</span><span class="p">,</span> <span class="n">Op</span> <span class="n">left</span><span class="p">,</span> <span class="n">Op</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span>
- <span class="sr">//</span> <span class="n">Bail</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">of</span> <span class="n">the</span> <span class="n">right</span> <span class="n">form</span>
- <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">left</span> <span class="n">instanceof</span> <span class="n">OpFilter</span> <span class="o">&&</span> <span class="n">right</span> <span class="n">instanceof</span> <span class="n">OpFilter</span><span class="p">))</span> <span class="k">return</span> <span class="nb">join</span><span class="p">;</span>
- <span class="n">OpFilter</span> <span class="n">leftF</span> <span class="o">=</span> <span class="p">(</span><span class="n">OpFilter</span><span class="p">)</span> <span class="n">left</span><span class="p">;</span>
- <span class="n">OpFilter</span> <span class="n">rightF</span> <span class="o">=</span> <span class="p">(</span><span class="n">OpFilter</span><span class="p">)</span> <span class="n">right</span><span class="p">;</span>
-
- <span class="sr">//</span> <span class="n">Add</span> <span class="n">all</span> <span class="n">of</span> <span class="n">the</span> <span class="n">triple</span> <span class="n">matches</span> <span class="n">to</span> <span class="n">the</span> <span class="n">LHS</span> <span class="n">BGP</span>
- <span class="p">((</span><span class="n">OpBGP</span><span class="p">)</span> <span class="n">leftF</span><span class="o">.</span><span class="n">getSubOp</span><span class="p">())</span><span class="o">.</span><span class="n">getPattern</span><span class="p">()</span><span class="o">.</span><span class="n">addAll</span><span class="p">(((</span><span class="n">OpBGP</span><span class="p">)</span> <span class="n">rightF</span><span class="o">.</span><span class="n">getSubOp</span><span class="p">())</span><span class="o">.</span><span class="n">getPattern</span><span class="p">());</span>
- <span class="sr">//</span> <span class="n">Add</span> <span class="n">the</span> <span class="n">RHS</span> <span class="n">filter</span> <span class="n">to</span> <span class="n">the</span> <span class="n">LHS</span>
- <span class="n">leftF</span><span class="o">.</span><span class="n">getExprs</span><span class="p">()</span><span class="o">.</span><span class="n">addAll</span><span class="p">(</span><span class="n">rightF</span><span class="o">.</span><span class="n">getExprs</span><span class="p">());</span>
+ <span class="p">@</span><span class="n">Override</span>
+ <span class="n">public</span> <span class="n">Op</span> <span class="n">transform</span><span class="p">(</span><span class="n">OpJoin</span> <span class="n">join</span><span class="p">,</span> <span class="n">Op</span> <span class="n">left</span><span class="p">,</span> <span class="n">Op</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span>
+ <span class="o">//</span> <span class="n">Bail</span> <span class="k">if</span> <span class="n">not</span> <span class="n">of</span> <span class="n">the</span> <span class="n">right</span> <span class="n">form</span>
+ <span class="k">if</span> <span class="p">(</span>!<span class="p">(</span><span class="n">left</span> <span class="n">instanceof</span> <span class="n">OpFilter</span> <span class="o">&&</span> <span class="n">right</span> <span class="n">instanceof</span> <span class="n">OpFilter</span><span class="p">))</span> <span class="k">return</span> <span class="n">join</span><span class="p">;</span>
+ <span class="n">OpFilter</span> <span class="n">leftF</span> <span class="p">=</span> <span class="p">(</span><span class="n">OpFilter</span><span class="p">)</span> <span class="n">left</span><span class="p">;</span>
+ <span class="n">OpFilter</span> <span class="n">rightF</span> <span class="p">=</span> <span class="p">(</span><span class="n">OpFilter</span><span class="p">)</span> <span class="n">right</span><span class="p">;</span>
+
+ <span class="o">//</span> <span class="n">Add</span> <span class="n">all</span> <span class="n">of</span> <span class="n">the</span> <span class="n">triple</span> <span class="n">matches</span> <span class="n">to</span> <span class="n">the</span> <span class="n">LHS</span> <span class="n">BGP</span>
+ <span class="p">((</span><span class="n">OpBGP</span><span class="p">)</span> <span class="n">leftF</span><span class="p">.</span><span class="n">getSubOp</span><span class="p">()).</span><span class="n">getPattern</span><span class="p">().</span><span class="n">addAll</span><span class="p">(((</span><span class="n">OpBGP</span><span class="p">)</span> <span class="n">rightF</span><span class="p">.</span><span class="n">getSubOp</span><span class="p">()).</span><span class="n">getPattern</span><span class="p">());</span>
+ <span class="o">//</span> <span class="n">Add</span> <span class="n">the</span> <span class="n">RHS</span> <span class="n">filter</span> <span class="n">to</span> <span class="n">the</span> <span class="n">LHS</span>
+ <span class="n">leftF</span><span class="p">.</span><span class="n">getExprs</span><span class="p">().</span><span class="n">addAll</span><span class="p">(</span><span class="n">rightF</span><span class="p">.</span><span class="n">getExprs</span><span class="p">());</span>
<span class="k">return</span> <span class="n">leftF</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
- <span class="o">...</span>
- <span class="n">op</span> <span class="o">=</span> <span class="n">Transformer</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="k">new</span> <span class="n">QueryCleaner</span><span class="p">(),</span> <span class="n">op</span><span class="p">);</span> <span class="sr">//</span> <span class="n">clean</span> <span class="n">query</span>
+ <span class="p">...</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">Transformer</span><span class="p">.</span><span class="n">transform</span><span class="p">(</span><span class="n">new</span> <span class="n">QueryCleaner</span><span class="p">(),</span> <span class="n">op</span><span class="p">);</span> <span class="o">//</span> <span class="n">clean</span> <span class="n">query</span>
</pre></div>
<p>This looks for joins of the form:</p>
-<div class="codehilite"><pre> <span class="p">(</span><span class="nb">join</span>
+<div class="codehilite"><pre> <span class="p">(</span><span class="n">join</span>
<span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="n">exp1</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp1</span><span class="p">))</span>
<span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="n">exp2</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp2</span><span class="p">)))</span>
</pre></div>
@@ -332,11 +332,11 @@ can do this with the following <code>Tra
<p>As we go through the original query all joins are removed, and the
result is:</p>
-<div class="codehilite"><pre> <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="n">exprlist</span> <span class="p">(</span><span class="o"><</span><span class="err">Â </span><span class="p">?</span><span class="n">o0</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="o"><</span><span class="err">Â </span><span class="p">?</span><span class="n">o1</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="o"><</span><span class="err">Â </span><span class="p">?</span><span class="n">o2</span> <span class="mi">20</span><span class="p">))</span>
+<div class="codehilite"><pre> <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="n">exprlist</span> <span class="p">(</span><span class="o"><</span>Â ?<span class="n">o0</span> 20<span class="p">)</span> <span class="p">(</span><span class="o"><</span>Â ?<span class="n">o1</span> 20<span class="p">)</span> <span class="p">(</span><span class="o"><</span>Â ?<span class="n">o2</span> 20<span class="p">))</span>
<span class="p">(</span><span class="n">bgp</span>
- <span class="p">(</span><span class="n">triple</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop0></span><span class="err">Â </span><span class="p">?</span><span class="n">o0</span><span class="p">)</span>
- <span class="p">(</span><span class="n">triple</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop1></span><span class="err">Â </span><span class="p">?</span><span class="n">o1</span><span class="p">)</span>
- <span class="p">(</span><span class="n">triple</span><span class="err">Â </span><span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop2></span><span class="err">Â </span><span class="p">?</span><span class="n">o2</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">triple</span>Â ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop0</span><span class="o">></span>Â ?<span class="n">o0</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">triple</span>Â ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop1</span><span class="o">></span>Â ?<span class="n">o1</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">triple</span>Â ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop2</span><span class="o">></span>Â ?<span class="n">o2</span><span class="p">)</span>
<span class="p">))</span>
</pre></div>
Modified: websites/staging/jena/trunk/content/documentation/query/manipulating_sparql_using_arq_pt.html
==============================================================================
--- websites/staging/jena/trunk/content/documentation/query/manipulating_sparql_using_arq_pt.html (original)
+++ websites/staging/jena/trunk/content/documentation/query/manipulating_sparql_using_arq_pt.html Thu Jun 20 10:18:34 2013
@@ -166,16 +166,16 @@ a API ARQ é sua amiga na longa jornad
blog</a></em></p>
<h2 id="inserindo-valores-comandos-simples-prontos">Inserindo valores (comandos simples prontos)</h2>
<p>Vamos começar com algo simples. Suponha que nós queiramos restringir a query a seguir a uma pessoa (person) em particular:</p>
-<div class="codehilite"><pre> <span class="nb">select</span> <span class="o">*</span> <span class="p">{</span> <span class="p">?</span><span class="n">person</span> <span class="sr"><http://xmlns.com/foaf/0.1/name></span> <span class="p">?</span><span class="n">name</span> <span class="p">}</span>
+<div class="codehilite"><pre> <span class="n">select</span> <span class="o">*</span> <span class="p">{</span> ?<span class="n">person</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">name</span><span class="o">></span> ?<span class="n">name</span> <span class="p">}</span>
</pre></div>
<p><code>String#replaceAll</code> deveria funcionar, mas existe um jeito mais seguro.
<code>QueryExecutionFactory</code> em muitos casos, permite que você alimente uma <code>QuerySolution</code>
com a qual você pode prefixar valores.</p>
-<div class="codehilite"><pre> <span class="n">QuerySolutionMap</span> <span class="n">initialBinding</span> <span class="o">=</span> <span class="k">new</span> <span class="n">QuerySolutionMap</span><span class="p">();</span>
- <span class="n">initialBinding</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="n">personResource</span><span class="p">);</span>
- <span class="n">qe</span> <span class="o">=</span> <span class="n">QueryExecutionFactory</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">initialBinding</span><span class="p">);</span>
+<div class="codehilite"><pre> <span class="n">QuerySolutionMap</span> <span class="n">initialBinding</span> <span class="p">=</span> <span class="n">new</span> <span class="n">QuerySolutionMap</span><span class="p">();</span>
+ <span class="n">initialBinding</span><span class="p">.</span><span class="n">add</span><span class="p">(</span>"<span class="n">name</span>"<span class="p">,</span> <span class="n">personResource</span><span class="p">);</span>
+ <span class="n">qe</span> <span class="p">=</span> <span class="n">QueryExecutionFactory</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">initialBinding</span><span class="p">);</span>
</pre></div>
@@ -187,22 +187,22 @@ citações. (Esteja ciente de que is
apenas a execução daquela query. Então, como nós realmente alteramos queries?</p>
<p>ARQ provê duas maneiras de se trabalhar com queries: no nÃvel de sintaxe (<code>Query</code>
and <code>Element</code>), ou no nÃvel algébrico (<code>Op</code>). A distinção entre eles fica claro com os filtros:</p>
-<div class="codehilite"><pre> <span class="n">SELECT</span> <span class="p">?</span><span class="n">s</span> <span class="p">{</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><http://example.com/val></span> <span class="p">?</span><span class="n">val</span> <span class="o">.</span> <span class="n">FILTER</span> <span class="p">(</span> <span class="p">?</span><span class="n">val</span> <span class="o"><</span> <span class="mi">20</span> <span class="p">)</span> <span class="p">}</span>
+<div class="codehilite"><pre> <span class="n">SELECT</span> ?<span class="n">s</span> <span class="p">{</span> ?<span class="n">s</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">com</span><span class="o">/</span><span class="n">val</span><span class="o">></span> ?<span class="n">val</span> <span class="p">.</span> <span class="n">FILTER</span> <span class="p">(</span> ?<span class="n">val</span> <span class="o"><</span> 20 <span class="p">)</span> <span class="p">}</span>
</pre></div>
<p>Se você trabalha no nÃvel de sintaxe, você irá descobrir que isso (em pseudo código) se parece com : </p>
-<div class="codehilite"><pre> <span class="p">(</span><span class="n">GROUP</span> <span class="p">(</span><span class="n">PATTERN</span> <span class="p">(</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><http://example.com/val></span> <span class="p">?</span><span class="n">val</span> <span class="p">))</span> <span class="p">(</span><span class="n">FILTER</span> <span class="p">(</span> <span class="o"><</span> <span class="p">?</span><span class="n">val</span> <span class="mi">20</span> <span class="p">)</span> <span class="p">))</span>
+<div class="codehilite"><pre> <span class="p">(</span><span class="n">GROUP</span> <span class="p">(</span><span class="n">PATTERN</span> <span class="p">(</span> ?<span class="n">s</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">com</span><span class="o">/</span><span class="n">val</span><span class="o">></span> ?<span class="n">val</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">val</span> 20 <span class="p">)</span> <span class="p">))</span>
</pre></div>
<p>Isto é, existe um grupo contendo um padrão triplo e um filtro, do mesmo jeito que você vê na query.
A álgebra é diferente e nós podemos vê-la usando <code>arq.qparse --print op</code></p>
-<div class="codehilite"><pre> <span class="nv">$</span> <span class="nv">java</span> <span class="n">arq</span><span class="o">.</span><span class="n">qparse</span> <span class="o">--</span><span class="k">print</span> <span class="n">op</span> <span class="s">'SELECT ?s { ?s <http://example.com/val> ?val . FILTER ( ?val < 20 ) }'</span>
- <span class="p">(</span><span class="n">base</span> <span class="sr"><file:///...></span>
- <span class="p">(</span><span class="n">project</span> <span class="p">(?</span><span class="n">s</span><span class="p">)</span>
- <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span> <span class="p">?</span><span class="n">val</span> <span class="mi">20</span><span class="p">)</span>
- <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><http://example.com/val></span> <span class="p">?</span><span class="n">val</span><span class="p">)))))</span>
+<div class="codehilite"><pre> $ <span class="n">java</span> <span class="n">arq</span><span class="p">.</span><span class="n">qparse</span> <span class="o">--</span><span class="n">print</span> <span class="n">op</span> <span class="s">'SELECT ?s { ?s <http://example.com/val> ?val . FILTER ( ?val < 20 ) }'</span>
+ <span class="p">(</span><span class="n">base</span> <span class="o"><</span><span class="n">file</span><span class="p">:</span><span class="o">///</span><span class="p">...</span><span class="o">></span>
+ <span class="p">(</span><span class="n">project</span> <span class="p">(</span>?<span class="n">s</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">val</span> 20<span class="p">)</span>
+ <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span> ?<span class="n">s</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">com</span><span class="o">/</span><span class="n">val</span><span class="o">></span> ?<span class="n">val</span><span class="p">)))))</span>
</pre></div>
@@ -210,40 +210,40 @@ A álgebra é diferente e nós pod
está filtrando o padrão.</p>
<p>Vamos criar esta query do zero usando ARQ. Nós começamos com algumas partes comuns: a tripla a ser comparada
e a expressão a ser filtrada.</p>
-<div class="codehilite"><pre> <span class="sr">//</span> <span class="p">?</span><span class="n">s</span> <span class="p">?</span><span class="n">p</span> <span class="p">?</span><span class="n">o</span> <span class="o">.</span>
- <span class="n">Triple</span> <span class="n">pattern</span> <span class="o">=</span>
- <span class="n">Triple</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">Var</span><span class="o">.</span><span class="n">alloc</span><span class="p">(</span><span class="s">"s"</span><span class="p">),</span> <span class="n">Var</span><span class="o">.</span><span class="n">alloc</span><span class="p">(</span><span class="s">"p"</span><span class="p">),</span> <span class="n">Var</span><span class="o">.</span><span class="n">alloc</span><span class="p">(</span><span class="s">"o"</span><span class="p">));</span>
- <span class="sr">//</span> <span class="p">(</span> <span class="p">?</span><span class="n">s</span> <span class="o"><</span> <span class="mi">20</span> <span class="p">)</span>
- <span class="n">Expr</span> <span class="n">e</span> <span class="o">=</span> <span class="k">new</span> <span class="n">E_LessThan</span><span class="p">(</span><span class="k">new</span> <span class="n">ExprVar</span><span class="p">(</span><span class="s">"s"</span><span class="p">),</span> <span class="k">new</span> <span class="n">NodeValueInteger</span><span class="p">(</span><span class="mi">20</span><span class="p">));</span>
+<div class="codehilite"><pre> <span class="o">//</span> ?<span class="n">s</span> ?<span class="n">p</span> ?<span class="n">o</span> <span class="p">.</span>
+ <span class="n">Triple</span> <span class="n">pattern</span> <span class="p">=</span>
+ <span class="n">Triple</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">Var</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span>"<span class="n">s</span>"<span class="p">),</span> <span class="n">Var</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span>"<span class="n">p</span>"<span class="p">),</span> <span class="n">Var</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span>"<span class="n">o</span>"<span class="p">));</span>
+ <span class="o">//</span> <span class="p">(</span> ?<span class="n">s</span> <span class="o"><</span> 20 <span class="p">)</span>
+ <span class="n">Expr</span> <span class="n">e</span> <span class="p">=</span> <span class="n">new</span> <span class="n">E_LessThan</span><span class="p">(</span><span class="n">new</span> <span class="n">ExprVar</span><span class="p">(</span>"<span class="n">s</span>"<span class="p">),</span> <span class="n">new</span> <span class="n">NodeValueInteger</span><span class="p">(</span>20<span class="p">));</span>
</pre></div>
<p><code>Triple</code> deveria ser familiar de Jena. <code>Var</code> é uma extensão de <code>Node</code>
para variáveis. <code>Expr</code> é a interface raÃz para expressões, aquelas coisas que aparecem em <code>FILTER</code> and <code>LET</code>.</p>
<p>Primeiro, o caminho da sintaxe:</p>
-<div class="codehilite"><pre> <span class="n">ElementTriplesBlock</span> <span class="n">block</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ElementTriplesBlock</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">BGP</span>
- <span class="n">block</span><span class="o">.</span><span class="n">addTriple</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Add</span> <span class="k">our</span> <span class="n">pattern</span> <span class="n">match</span>
- <span class="n">ElementFilter</span> <span class="n">filter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ElementFilter</span><span class="p">(</span><span class="n">e</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">filter</span> <span class="n">matching</span> <span class="n">the</span> <span class="n">expression</span>
- <span class="n">ElementGroup</span> <span class="n">body</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ElementGroup</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Group</span> <span class="k">our</span> <span class="n">pattern</span> <span class="n">match</span> <span class="ow">and</span> <span class="n">filter</span>
- <span class="n">body</span><span class="o">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">block</span><span class="p">);</span>
- <span class="n">body</span><span class="o">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">filter</span><span class="p">);</span>
-
- <span class="n">Query</span> <span class="sx">q = </span><span class="n">QueryFactory</span><span class="o">.</span><span class="n">make</span><span class="p">();</span>
- <span class="sx">q.setQueryPattern(body); // Set the body of the query to our group</span>
-<span class="sx"> q.</span><span class="n">setQuerySelectType</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">it</span> <span class="n">a</span> <span class="nb">select</span> <span class="n">query</span>
- <span class="n">q</span><span class="o">.</span><span class="n">addResultVar</span><span class="p">(</span><span class="s">"s"</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Select</span> <span class="p">?</span><span class="n">s</span>
+<div class="codehilite"><pre> <span class="n">ElementTriplesBlock</span> <span class="n">block</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ElementTriplesBlock</span><span class="p">();</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">BGP</span>
+ <span class="n">block</span><span class="p">.</span><span class="n">addTriple</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span> <span class="o">//</span> <span class="n">Add</span> <span class="n">our</span> <span class="n">pattern</span> <span class="n">match</span>
+ <span class="n">ElementFilter</span> <span class="n">filter</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ElementFilter</span><span class="p">(</span><span class="n">e</span><span class="p">);</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">filter</span> <span class="n">matching</span> <span class="n">the</span> <span class="n">expression</span>
+ <span class="n">ElementGroup</span> <span class="n">body</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ElementGroup</span><span class="p">();</span> <span class="o">//</span> <span class="n">Group</span> <span class="n">our</span> <span class="n">pattern</span> <span class="n">match</span> <span class="n">and</span> <span class="n">filter</span>
+ <span class="n">body</span><span class="p">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">block</span><span class="p">);</span>
+ <span class="n">body</span><span class="p">.</span><span class="n">addElement</span><span class="p">(</span><span class="n">filter</span><span class="p">);</span>
+
+ <span class="n">Query</span> <span class="n">q</span> <span class="p">=</span> <span class="n">QueryFactory</span><span class="p">.</span><span class="n">make</span><span class="p">();</span>
+ <span class="n">q</span><span class="p">.</span><span class="n">setQueryPattern</span><span class="p">(</span><span class="n">body</span><span class="p">);</span> <span class="o">//</span> <span class="n">Set</span> <span class="n">the</span> <span class="n">body</span> <span class="n">of</span> <span class="n">the</span> <span class="n">query</span> <span class="n">to</span> <span class="n">our</span> <span class="n">group</span>
+ <span class="n">q</span><span class="p">.</span><span class="n">setQuerySelectType</span><span class="p">();</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">it</span> <span class="n">a</span> <span class="n">select</span> <span class="n">query</span>
+ <span class="n">q</span><span class="p">.</span><span class="n">addResultVar</span><span class="p">(</span>"<span class="n">s</span>"<span class="p">);</span> <span class="o">//</span> <span class="n">Select</span> ?<span class="n">s</span>
</pre></div>
<p>Agora a álgebra:</p>
<div class="codehilite"><pre> <span class="n">Op</span> <span class="n">op</span><span class="p">;</span>
- <span class="n">BasicPattern</span> <span class="n">pat</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BasicPattern</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">pattern</span>
- <span class="n">pat</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Add</span> <span class="k">our</span> <span class="n">pattern</span> <span class="n">match</span>
- <span class="n">op</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OpBGP</span><span class="p">(</span><span class="n">pat</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">BGP</span> <span class="n">from</span> <span class="n">this</span> <span class="n">pattern</span>
- <span class="n">op</span> <span class="o">=</span> <span class="n">OpFilter</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">op</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Filter</span> <span class="n">that</span> <span class="n">pattern</span> <span class="n">with</span> <span class="k">our</span> <span class="n">expression</span>
- <span class="n">op</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OpProject</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">Arrays</span><span class="o">.</span><span class="n">asList</span><span class="p">(</span><span class="n">Var</span><span class="o">.</span><span class="n">alloc</span><span class="p">(</span><span class="s">"s"</span><span class="p">)));</span> <span class="sr">//</span> <span class="n">Reduce</span> <span class="n">to</span> <span class="n">just</span> <span class="p">?</span><span class="n">s</span>
- <span class="n">Query</span> <span class="sx">q = </span><span class="n">OpAsQuery</span><span class="o">.</span><span class="n">asQuery</span><span class="p">(</span><span class="n">op</span><span class="p">);</span> <span class="sr">//</span> <span class="n">Convert</span> <span class="n">to</span> <span class="n">a</span> <span class="n">query</span>
- <span class="n">q</span><span class="o">.</span><span class="n">setQuerySelectType</span><span class="p">();</span> <span class="sr">//</span> <span class="n">Make</span> <span class="n">is</span> <span class="n">a</span> <span class="nb">select</span> <span class="n">query</span>
+ <span class="n">BasicPattern</span> <span class="n">pat</span> <span class="p">=</span> <span class="n">new</span> <span class="n">BasicPattern</span><span class="p">();</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">pattern</span>
+ <span class="n">pat</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">pattern</span><span class="p">);</span> <span class="o">//</span> <span class="n">Add</span> <span class="n">our</span> <span class="n">pattern</span> <span class="n">match</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">new</span> <span class="n">OpBGP</span><span class="p">(</span><span class="n">pat</span><span class="p">);</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">a</span> <span class="n">BGP</span> <span class="n">from</span> <span class="n">this</span> <span class="n">pattern</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">OpFilter</span><span class="p">.</span><span class="n">filter</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">op</span><span class="p">);</span> <span class="o">//</span> <span class="n">Filter</span> <span class="n">that</span> <span class="n">pattern</span> <span class="n">with</span> <span class="n">our</span> <span class="n">expression</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">new</span> <span class="n">OpProject</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">Arrays</span><span class="p">.</span><span class="n">asList</span><span class="p">(</span><span class="n">Var</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span>"<span class="n">s</span>"<span class="p">)));</span> <span class="o">//</span> <span class="n">Reduce</span> <span class="n">to</span> <span class="n">just</span> ?<span class="n">s</span>
+ <span class="n">Query</span> <span class="n">q</span> <span class="p">=</span> <span class="n">OpAsQuery</span><span class="p">.</span><span class="n">asQuery</span><span class="p">(</span><span class="n">op</span><span class="p">);</span> <span class="o">//</span> <span class="n">Convert</span> <span class="n">to</span> <span class="n">a</span> <span class="n">query</span>
+ <span class="n">q</span><span class="p">.</span><span class="n">setQuerySelectType</span><span class="p">();</span> <span class="o">//</span> <span class="n">Make</span> <span class="n">is</span> <span class="n">a</span> <span class="n">select</span> <span class="n">query</span>
</pre></div>
@@ -262,24 +262,22 @@ então dê um passo a frente e use <
<h2 id="transformando-a-algebra">Transformando a Ãlgebra</h2>
<p>A primeira vista, não há vantagens óbvias em usar a álgebra. O real poder fica claro com o uso de
transformers (transformações), que lhe permitem reorganizar uma álgebra completamente. ARQ faz amplo
-uso de transformers para simplificar e aperfeiçoar execuções de query.<br />
-</p>
+uso de transformers para simplificar e aperfeiçoar execuções de query. </p>
<p>Em Research Revealed (Pesquisa revelada, em tradução livre), eu escrevi algum código para pegar certo
número de constraints (constantes) e produzir uma query. Havia várias formas de se fazer isto, mas o
-jeito que eu achei foi gerar ops de cada constraint e juntar o resultado.<br />
-</p>
-<div class="codehilite"><pre> <span class="k">for</span> <span class="p">(</span><span class="n">Constraint</span> <span class="n">con:</span> <span class="n">cons</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">op</span> <span class="o">=</span> <span class="n">OpJoin</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">consToOp</span><span class="p">(</span><span class="n">cons</span><span class="p">));</span> <span class="sr">//</span> <span class="nb">join</span>
+jeito que eu achei foi gerar ops de cada constraint e juntar o resultado. </p>
+<div class="codehilite"><pre> <span class="k">for</span> <span class="p">(</span><span class="n">Constraint</span> <span class="n">con</span><span class="p">:</span> <span class="n">cons</span><span class="p">)</span> <span class="p">{</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">OpJoin</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">consToOp</span><span class="p">(</span><span class="n">cons</span><span class="p">));</span> <span class="o">//</span> <span class="n">join</span>
<span class="p">}</span>
</pre></div>
<p>O resultado foi uma bagunça incrivelmente correta, que é remotamente compreensÃvel em apenas três condições:</p>
-<div class="codehilite"><pre> <span class="p">(</span><span class="nb">join</span>
- <span class="p">(</span><span class="nb">join</span>
- <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span> <span class="p">?</span><span class="n">o0</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop0></span> <span class="p">?</span><span class="n">o0</span><span class="p">)))</span>
- <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span> <span class="p">?</span><span class="n">o1</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop1></span> <span class="p">?</span><span class="n">o1</span><span class="p">))))</span>
- <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span> <span class="p">?</span><span class="n">o2</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop2></span> <span class="p">?</span><span class="n">o2</span><span class="p">))))</span>
+<div class="codehilite"><pre> <span class="p">(</span><span class="n">join</span>
+ <span class="p">(</span><span class="n">join</span>
+ <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="o"><</span> ?<span class="n">o0</span> 20<span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span> ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop0</span><span class="o">></span> ?<span class="n">o0</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">o1</span> 20<span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span> ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop1</span><span class="o">></span> ?<span class="n">o1</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">o2</span> 20<span class="p">)</span> <span class="p">(</span><span class="n">bgp</span> <span class="p">(</span><span class="n">triple</span> ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop2</span><span class="o">></span> ?<span class="n">o2</span><span class="p">))))</span>
</pre></div>
@@ -287,27 +285,27 @@ jeito que eu achei foi gerar ops de cada
filtros e juntando (merging) os padrões triplos. Nós podemos fazer isso usando <code>Transform</code>:</p>
<div class="codehilite"><pre> <span class="n">class</span> <span class="n">QueryCleaner</span> <span class="n">extends</span> <span class="n">TransformBase</span>
<span class="p">{</span>
- <span class="nv">@Override</span>
- <span class="n">public</span> <span class="n">Op</span> <span class="n">transform</span><span class="p">(</span><span class="n">OpJoin</span> <span class="nb">join</span><span class="p">,</span> <span class="n">Op</span> <span class="n">left</span><span class="p">,</span> <span class="n">Op</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span>
- <span class="sr">//</span> <span class="n">Bail</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">of</span> <span class="n">the</span> <span class="n">right</span> <span class="n">form</span>
- <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">left</span> <span class="n">instanceof</span> <span class="n">OpFilter</span> <span class="o">&&</span> <span class="n">right</span> <span class="n">instanceof</span> <span class="n">OpFilter</span><span class="p">))</span> <span class="k">return</span> <span class="nb">join</span><span class="p">;</span>
- <span class="n">OpFilter</span> <span class="n">leftF</span> <span class="o">=</span> <span class="p">(</span><span class="n">OpFilter</span><span class="p">)</span> <span class="n">left</span><span class="p">;</span>
- <span class="n">OpFilter</span> <span class="n">rightF</span> <span class="o">=</span> <span class="p">(</span><span class="n">OpFilter</span><span class="p">)</span> <span class="n">right</span><span class="p">;</span>
-
- <span class="sr">//</span> <span class="n">Add</span> <span class="n">all</span> <span class="n">of</span> <span class="n">the</span> <span class="n">triple</span> <span class="n">matches</span> <span class="n">to</span> <span class="n">the</span> <span class="n">LHS</span> <span class="n">BGP</span>
- <span class="p">((</span><span class="n">OpBGP</span><span class="p">)</span> <span class="n">leftF</span><span class="o">.</span><span class="n">getSubOp</span><span class="p">())</span><span class="o">.</span><span class="n">getPattern</span><span class="p">()</span><span class="o">.</span><span class="n">addAll</span><span class="p">(((</span><span class="n">OpBGP</span><span class="p">)</span> <span class="n">rightF</span><span class="o">.</span><span class="n">getSubOp</span><span class="p">())</span><span class="o">.</span><span class="n">getPattern</span><span class="p">());</span>
- <span class="sr">//</span> <span class="n">Add</span> <span class="n">the</span> <span class="n">RHS</span> <span class="n">filter</span> <span class="n">to</span> <span class="n">the</span> <span class="n">LHS</span>
- <span class="n">leftF</span><span class="o">.</span><span class="n">getExprs</span><span class="p">()</span><span class="o">.</span><span class="n">addAll</span><span class="p">(</span><span class="n">rightF</span><span class="o">.</span><span class="n">getExprs</span><span class="p">());</span>
+ <span class="p">@</span><span class="n">Override</span>
+ <span class="n">public</span> <span class="n">Op</span> <span class="n">transform</span><span class="p">(</span><span class="n">OpJoin</span> <span class="n">join</span><span class="p">,</span> <span class="n">Op</span> <span class="n">left</span><span class="p">,</span> <span class="n">Op</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span>
+ <span class="o">//</span> <span class="n">Bail</span> <span class="k">if</span> <span class="n">not</span> <span class="n">of</span> <span class="n">the</span> <span class="n">right</span> <span class="n">form</span>
+ <span class="k">if</span> <span class="p">(</span>!<span class="p">(</span><span class="n">left</span> <span class="n">instanceof</span> <span class="n">OpFilter</span> <span class="o">&&</span> <span class="n">right</span> <span class="n">instanceof</span> <span class="n">OpFilter</span><span class="p">))</span> <span class="k">return</span> <span class="n">join</span><span class="p">;</span>
+ <span class="n">OpFilter</span> <span class="n">leftF</span> <span class="p">=</span> <span class="p">(</span><span class="n">OpFilter</span><span class="p">)</span> <span class="n">left</span><span class="p">;</span>
+ <span class="n">OpFilter</span> <span class="n">rightF</span> <span class="p">=</span> <span class="p">(</span><span class="n">OpFilter</span><span class="p">)</span> <span class="n">right</span><span class="p">;</span>
+
+ <span class="o">//</span> <span class="n">Add</span> <span class="n">all</span> <span class="n">of</span> <span class="n">the</span> <span class="n">triple</span> <span class="n">matches</span> <span class="n">to</span> <span class="n">the</span> <span class="n">LHS</span> <span class="n">BGP</span>
+ <span class="p">((</span><span class="n">OpBGP</span><span class="p">)</span> <span class="n">leftF</span><span class="p">.</span><span class="n">getSubOp</span><span class="p">()).</span><span class="n">getPattern</span><span class="p">().</span><span class="n">addAll</span><span class="p">(((</span><span class="n">OpBGP</span><span class="p">)</span> <span class="n">rightF</span><span class="p">.</span><span class="n">getSubOp</span><span class="p">()).</span><span class="n">getPattern</span><span class="p">());</span>
+ <span class="o">//</span> <span class="n">Add</span> <span class="n">the</span> <span class="n">RHS</span> <span class="n">filter</span> <span class="n">to</span> <span class="n">the</span> <span class="n">LHS</span>
+ <span class="n">leftF</span><span class="p">.</span><span class="n">getExprs</span><span class="p">().</span><span class="n">addAll</span><span class="p">(</span><span class="n">rightF</span><span class="p">.</span><span class="n">getExprs</span><span class="p">());</span>
<span class="k">return</span> <span class="n">leftF</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
- <span class="o">...</span>
- <span class="n">op</span> <span class="o">=</span> <span class="n">Transformer</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="k">new</span> <span class="n">QueryCleaner</span><span class="p">(),</span> <span class="n">op</span><span class="p">);</span> <span class="sr">//</span> <span class="n">clean</span> <span class="n">query</span>
+ <span class="p">...</span>
+ <span class="n">op</span> <span class="p">=</span> <span class="n">Transformer</span><span class="p">.</span><span class="n">transform</span><span class="p">(</span><span class="n">new</span> <span class="n">QueryCleaner</span><span class="p">(),</span> <span class="n">op</span><span class="p">);</span> <span class="o">//</span> <span class="n">clean</span> <span class="n">query</span>
</pre></div>
<p>O código abaixo procura pelos joins do formulário:</p>
-<div class="codehilite"><pre> <span class="p">(</span><span class="nb">join</span>
+<div class="codehilite"><pre> <span class="p">(</span><span class="n">join</span>
<span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="n">exp1</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp1</span><span class="p">))</span>
<span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="n">exp2</span><span class="p">)</span> <span class="p">(</span><span class="n">bgp2</span><span class="p">)))</span>
</pre></div>
@@ -319,11 +317,11 @@ jeito que eu achei foi gerar ops de cada
<p>Enquanto nós percorremos a query original, todos os joins são removidos e o resultado final é:</p>
-<div class="codehilite"><pre> <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="n">exprlist</span> <span class="p">(</span><span class="o"><</span> <span class="p">?</span><span class="n">o0</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="o"><</span> <span class="p">?</span><span class="n">o1</span> <span class="mi">20</span><span class="p">)</span> <span class="p">(</span><span class="o"><</span> <span class="p">?</span><span class="n">o2</span> <span class="mi">20</span><span class="p">))</span>
+<div class="codehilite"><pre> <span class="p">(</span><span class="n">filter</span> <span class="p">(</span><span class="n">exprlist</span> <span class="p">(</span><span class="o"><</span> ?<span class="n">o0</span> 20<span class="p">)</span> <span class="p">(</span><span class="o"><</span> ?<span class="n">o1</span> 20<span class="p">)</span> <span class="p">(</span><span class="o"><</span> ?<span class="n">o2</span> 20<span class="p">))</span>
<span class="p">(</span><span class="n">bgp</span>
- <span class="p">(</span><span class="n">triple</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop0></span> <span class="p">?</span><span class="n">o0</span><span class="p">)</span>
- <span class="p">(</span><span class="n">triple</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop1></span> <span class="p">?</span><span class="n">o1</span><span class="p">)</span>
- <span class="p">(</span><span class="n">triple</span> <span class="p">?</span><span class="n">s</span> <span class="sr"><urn:ex:prop2></span> <span class="p">?</span><span class="n">o2</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">triple</span> ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop0</span><span class="o">></span> ?<span class="n">o0</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">triple</span> ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop1</span><span class="o">></span> ?<span class="n">o1</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">triple</span> ?<span class="n">s</span> <span class="o"><</span><span class="n">urn</span><span class="p">:</span><span class="n">ex</span><span class="p">:</span><span class="n">prop2</span><span class="o">></span> ?<span class="n">o2</span><span class="p">)</span>
<span class="p">))</span>
</pre></div>