blob: dc8399d32f56dc7525508e0918ef3938e5ff03f5 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - ARQ - SPARQL Algebra</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="/css/bootstrap-extension.css" rel="stylesheet" type="text/css">
<link href="/css/jena.css" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="/images/favicon.ico" />
<script src="https://code.jquery.com/jquery-2.2.4.min.js"
integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
crossorigin="anonymous"></script>
<script src="/js/jena-navigation.js" type="text/javascript"></script>
<script src="/js/bootstrap.min.js" type="text/javascript"></script>
<script src="/js/improve.js" type="text/javascript"></script>
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/index.html">
<img class="logo-menu" src="/images/jena-logo/jena-logo-notext-small.png" alt="jena logo">Apache Jena</a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<li id="homepage"><a href="/index.html"><span class="glyphicon glyphicon-home"></span> Home</a></li>
<li id="download"><a href="/download/index.cgi"><span class="glyphicon glyphicon-download-alt"></span> Download</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-book"></span> Learn <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="dropdown-header">Tutorials</li>
<li><a href="/tutorials/index.html">Overview</a></li>
<li><a href="/documentation/fuseki2/index.html">Fuseki Triplestore</a></li>
<li><a href="/documentation/notes/index.html">How-To's</a></li>
<li><a href="/documentation/query/manipulating_sparql_using_arq.html">Manipulating SPARQL using ARQ</a></li>
<li><a href="/tutorials/rdf_api.html">RDF core API tutorial</a></li>
<li><a href="/tutorials/sparql.html">SPARQL tutorial</a></li>
<li><a href="/tutorials/using_jena_with_eclipse.html">Using Jena with Eclipse</a></li>
<li class="divider"></li>
<li class="dropdown-header">References</li>
<li><a href="/documentation/index.html">Overview</a></li>
<li><a href="/documentation/query/index.html">ARQ (SPARQL)</a></li>
<li><a href="/documentation/assembler/index.html">Assembler</a></li>
<li><a href="/documentation/tools/index.html">Command-line tools</a></li>
<li><a href="/documentation/rdfs/">Data with RDFS Inferencing</a></li>
<li><a href="/documentation/geosparql/index.html">GeoSPARQL</a></li>
<li><a href="/documentation/inference/index.html">Inference API</a></li>
<li><a href="/documentation/javadoc.html">Javadoc</a></li>
<li><a href="/documentation/ontology/">Ontology API</a></li>
<li><a href="/documentation/permissions/index.html">Permissions</a></li>
<li><a href="/documentation/extras/querybuilder/index.html">Query Builder</a></li>
<li><a href="/documentation/rdf/index.html">RDF API</a></li>
<li><a href="/documentation/rdfconnection/">RDF Connection - SPARQL API</a></li>
<li><a href="/documentation/io/">RDF I/O</a></li>
<li><a href="/documentation/rdfstar/index.html">RDF-star</a></li>
<li><a href="/documentation/shacl/index.html">SHACL</a></li>
<li><a href="/documentation/shex/index.html">ShEx</a></li>
<li><a href="/documentation/jdbc/index.html">SPARQL over JDBC</a></li>
<li><a href="/documentation/tdb/index.html">TDB</a></li>
<li><a href="/documentation/tdb2/index.html">TDB2</a></li>
<li><a href="/documentation/query/text-query.html">Text Search</a></li>
</ul>
</li>
<li class="drop down">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-book"></span> Javadoc <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/documentation/javadoc.html">All Javadoc</a></li>
<li><a href="/documentation/javadoc/arq/">ARQ</a></li>
<li><a href="/documentation/javadoc_elephas.html">Elephas</a></li>
<li><a href="/documentation/javadoc/fuseki2/">Fuseki</a></li>
<li><a href="/documentation/javadoc/geosparql/">GeoSPARQL</a></li>
<li><a href="/documentation/javadoc/jdbc/">JDBC</a></li>
<li><a href="/documentation/javadoc/jena/">Jena Core</a></li>
<li><a href="/documentation/javadoc/permissions/">Permissions</a></li>
<li><a href="/documentation/javadoc/extras/querybuilder/">Query Builder</a></li>
<li><a href="/documentation/javadoc/shacl/">SHACL</a></li>
<li><a href="/documentation/javadoc/tdb/">TDB</a></li>
<li><a href="/documentation/javadoc/text/">Text Search</a></li>
</ul>
</li>
<li id="ask"><a href="/help_and_support/index.html"><span class="glyphicon glyphicon-question-sign"></span> Ask</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-bullhorn"></span> Get involved <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/getting_involved/index.html">Contribute</a></li>
<li><a href="/help_and_support/bugs_and_suggestions.html">Report a bug</a></li>
<li class="divider"></li>
<li class="dropdown-header">Project</li>
<li><a href="/about_jena/about.html">About Jena</a></li>
<li><a href="/about_jena/architecture.html">Architecture</a></li>
<li><a href="/about_jena/citing.html">Citing</a></li>
<li><a href="/about_jena/team.html">Project team</a></li>
<li><a href="/about_jena/contributions.html">Related projects</a></li>
<li><a href="/about_jena/roadmap.html">Roadmap</a></li>
<li class="divider"></li>
<li class="dropdown-header">ASF</li>
<li><a href="http://www.apache.org/">Apache Software Foundation</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a></li>
<li><a href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li>
<li><a href="http://www.apache.org/security/">Security</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
</ul>
</li>
<li id="edit"><a href="https://github.com/apache/jena-site/edit/main/source/documentation/query/algebra.md" title="Edit this page on GitHub"><span class="glyphicon glyphicon-pencil"></span> Edit this page</a></li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-12">
<div id="breadcrumbs">
<ol class="breadcrumb">
<li><a href='/documentation'>DOCUMENTATION</a></li>
<li><a href='/documentation/query'>QUERY</a></li>
<li class="active">ALGEBRA</li>
</ol>
</div>
<h1 class="title">ARQ - SPARQL Algebra</h1>
<p>A SPARQL query in ARQ goes through several stages of processing:</p>
<ul>
<li>String to Query (parsing)</li>
<li>Translation from Query to a SPARQL algebra expression</li>
<li>Optimization of the algebra expression</li>
<li>Query plan determination and low-level optimization</li>
<li>Evaluation of the query plan</li>
</ul>
<p>This page describes how to access and use expressions in the SPARQL
algebra within ARQ. The definition of the SPARQL algebra is to be
found in the SPARQL specification in
<a href="http://www.w3.org/TR/sparql11-query/#sparqlDefinition">section 12</a>.
<a href="arq-query-eval.html">ARQ can be extended</a> to modify the evaluation
of the algebra form to access different graph storage
implementations.</p>
<p>The classes for the datastructures for the algebra resize in the
package <code>org.apache.jena.sparql.algebra</code> in the <code>op</code> subpackage. 
All the classes are names &ldquo;<code>Op...</code>&rdquo;; the interface that they all
offer is &ldquo;<code>Op</code>&rdquo;.</p>
<h2 id="viewing-the-algebra-expression-for-a-query">Viewing the algebra expression for a Query</h2>
<p>The command line tool <a href="cmds.html#arq.qparse">arq.qparse</a> will print
the algebra form of a query:</p>
<pre><code>arq.qparse --print=op --query=Q.rq
arq.qparse --print=op 'SELECT * { ?s ?p ?o}'
</code></pre>
<p>The syntax of the output is <a href="../notes/sse.html">SSE</a>, a
simple format for writing data structures involving RDF terms. It
can be read back in again to produce the Java form of the algebra
expression.</p>
<h2 id="turning-a-query-into-an-algebra-expression">Turning a query into an algebra expression</h2>
<p>Getting the algebra expression for a Query is simply a matter of
passing the parsed Query object to the transaction function in the
<code>Algebra</code> class:</p>
<pre><code>Query query = QueryFactory.create(.....) ;
Op op = Algebra.compile(query) ;
</code></pre>
<p>And back again.</p>
<pre><code>Query query = OpAsQuery.asQuery(op) ;
System.out.println(query.serialize()) ;
</code></pre>
<p>This reverse translation can handle any algebra expression
originally from a SPARQL Query, but not any algebra expression.  It
is possible to create programmatically useful algebra expressions
that can not be turned into a query, especially if they involve
algebra.  Also, the query produced may not be exactly the same but
will yield the same results (for example, filters may be moved
because the SPARQL query algebra translation in the SPARQL
specification moves filter expressions around).</p>
<h2 id="directly-reading-and-writing-algebra-expression">Directly reading and writing algebra expression</h2>
<p>The SSE class is a collection of functions to parse SSE expressions
for the SPARQL algebra but also RDF terms, filter expressions and
even dataset and graphs.</p>
<pre><code>Op op = SSE.parseOp(&quot;(bgp (?s ?p ?o))&quot;) ; // Read a string
Op op = SSE.readOp(&quot;filename.sse&quot;) ; // Read a file
</code></pre>
<p>The SSE class simply calls the appropriate builder operation from
the <code>org.apache.jena.sparql.sse.builder</code> package.</p>
<p>To go with this, there is a collection of writers for many of the
Java structures in ARQ. </p>
<pre><code>Op op = ... ;
SSE.write(op) ; // Write to stdout
</code></pre>
<p>Writers default to writing to <code>System.out</code> but support calls to any
output stream (it manages the conversion to UTF-8) and ARQ own
<code>IndentedWriter</code>s form for embedding in structured output.  Again,
SSE is simply passing the calls to the writer operation from the
<code>org.apache.jena.sparql.sse.writer</code> package.</p>
<h2 id="creating-an-algebra-expression-programmatically">Creating an algebra expression programmatically</h2>
<p>See the example in
<a href="https://github.com/apache/jena/tree/main/jena-examples/src/main/java/arq/examples/algebra/AlgebraExec.java">AlgebraExec</a>.</p>
<p>To produce the complete javadoc for ARQ, download an ARQ
distribution and run the ant task &lsquo;javadoc-all&rsquo;.</p>
<h2 id="evaluating-a-algebra-expression">Evaluating a algebra expression</h2>
<pre><code>QueryIterator qIter = Algebra.exec(op,graph) ;
QueryIterator qIter = Algebra.exec(op,datasetGraph) ;
</code></pre>
<p>Evaluating an algebra expression produces a iterator of query
solutions (called Bindings).</p>
<pre><code>for ( ; qIter.hasNext() ; )
{
Binding b = qIter.nextBinding() ;
Node n = b.get(var_x) ;
System.out.println(var_x+&quot; = &quot;+FmtUtils.stringForNode(n)) ;
}
qIter.close() ;
</code></pre>
<p>Operations of <code>CONSTRUCT</code>, <code>DESCRIBE</code> and <code>ASK</code> are done on top
of algebra evaluation. Applications can access this functionality
by creating their own <code>QueryEngine</code> (see
<code>arq.examples.engine.MyQueryEngine</code>) and it&rsquo;s factory. A query
engine is a one-time use object for each query execution.</p>
<p><a href="index.html">ARQ documentation index</a></p>
</div>
</div>
</div>
<footer class="footer">
<div class="container" style="font-size:80%" >
<p>
Copyright &copy; 2011&ndash;2022 The Apache Software Foundation, Licensed under the
<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
</p>
<p>
Apache Jena, Jena, the Apache Jena project logo, Apache and the Apache feather logos are trademarks of
The Apache Software Foundation.
<br/>
<a href="https://privacy.apache.org/policies/privacy-policy-public.html"
>Apache Software Foundation Privacy Policy</a>.
</p>
</div>
</footer>
<script type="text/javascript">
var link = $('a[href="' + this.location.pathname + '"]');
if (link != undefined)
link.parents('li,ul').addClass('active');
</script>
</body>
</html>