blob: a1baf8868b3df7ca6b94034f94a2384e4c9f6139 [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-icons.css" rel="stylesheet" media="screen"><link rel="stylesheet" type="text/css" href="https://jena.apache.org/sass/jena.1b17c39a117e22b46db4c66f6395dc27c134a60377d87d2d5745b8600eb69722.css" integrity="sha256-GxfDmhF&#43;IrRttMZvY5XcJ8E0pgN32H0tV0W4YA62lyI=">
<link rel="shortcut icon" href="/images/favicon.ico" />
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary" role="navigation">
<div class="container">
<div class="navbar-header">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></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" id="navbarNav">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li id="homepage" class="nav-item"><a class="nav-link" href="/index.html"><span class="bi-house"></span> Home</a></li>
<li id="download" class="nav-item"><a class="nav-link" href="/download/index.cgi"><span class="bi-download"></span> Download</a></li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span class="bi-journal"></span> Learn <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="dropdown-header">Tutorials</li>
<li><a class="dropdown-item" href="/tutorials/index.html">Overview</a></li>
<li><a class="dropdown-item" href="/documentation/fuseki2/index.html">Fuseki Triplestore</a></li>
<li><a class="dropdown-item" href="/documentation/notes/index.html">How-To's</a></li>
<li><a class="dropdown-item" href="/documentation/query/manipulating_sparql_using_arq.html">Manipulating SPARQL using ARQ</a></li>
<li><a class="dropdown-item" href="/tutorials/rdf_api.html">RDF core API tutorial</a></li>
<li><a class="dropdown-item" href="/tutorials/sparql.html">SPARQL tutorial</a></li>
<li><a class="dropdown-item" href="/tutorials/using_jena_with_eclipse.html">Using Jena with Eclipse</a></li>
<li class="dropdown-divider"></li>
<li class="dropdown-header">References</li>
<li><a class="dropdown-item" href="/documentation/index.html">Overview</a></li>
<li><a class="dropdown-item" href="/documentation/query/index.html">ARQ (SPARQL)</a></li>
<li><a class="dropdown-item" href="/documentation/io/">RDF I/O</a></li>
<li><a class="dropdown-item" href="/documentation/assembler/index.html">Assembler</a></li>
<li><a class="dropdown-item" href="/documentation/tools/index.html">Command-line tools</a></li>
<li><a class="dropdown-item" href="/documentation/rdfs/">Data with RDFS Inferencing</a></li>
<li><a class="dropdown-item" href="/documentation/geosparql/index.html">GeoSPARQL</a></li>
<li><a class="dropdown-item" href="/documentation/inference/index.html">Inference API</a></li>
<li><a class="dropdown-item" href="/documentation/ontology/">Ontology API</a></li>
<li><a class="dropdown-item" href="/documentation/permissions/index.html">Permissions</a></li>
<li><a class="dropdown-item" href="/documentation/extras/querybuilder/index.html">Query Builder</a></li>
<li><a class="dropdown-item" href="/documentation/rdf/index.html">RDF API</a></li>
<li><a class="dropdown-item" href="/documentation/rdfconnection/">RDF Connection - SPARQL API</a></li>
<li><a class="dropdown-item" href="/documentation/rdfstar/index.html">RDF-star</a></li>
<li><a class="dropdown-item" href="/documentation/shacl/index.html">SHACL</a></li>
<li><a class="dropdown-item" href="/documentation/shex/index.html">ShEx</a></li>
<li><a class="dropdown-item" href="/documentation/tdb/index.html">TDB</a></li>
<li><a class="dropdown-item" href="/documentation/tdb2/index.html">TDB2</a></li>
<li><a class="dropdown-item" href="/documentation/query/text-query.html">Text Search</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span class="bi-journal-code"></span> Javadoc <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/documentation/javadoc.html">All Javadoc</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/arq/">ARQ</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/fuseki2/">Fuseki</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/geosparql/">GeoSPARQL</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/jena/">Jena Core</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/permissions/">Permissions</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/extras/querybuilder/">Query Builder</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/shacl/">SHACL</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/tdb/">TDB</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/text/">Text Search</a></li>
</ul>
</li>
</ul>
<form class="d-flex" role="search" action="/search" method="GET">
<div class="input-group">
<input class="form-control border-end-0 border m-0" type="search" name="q" id="search-query" placeholder="Search...." aria-label="Search" style="width: 10rem;">
<button class="btn btn-outline-secondary border-start-0 border" type="submit">
<i class="bi-search"></i>
</button>
</div>
</form>
<ul class="navbar-nav">
<li id="ask" class="nav-item"><a class="nav-link" href="/help_and_support/index.html" title="Ask"><span class="bi-patch-question"></span><span class="text-body d-none d-xxl-inline"> Ask</span></a></li>
<li class="nav-item dropdown">
<a href="#" title="Get involved" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span class="bi-megaphone"></span><span class="text-body d-none d-xxl-inline"> Get involved </span><b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/getting_involved/index.html">Contribute</a></li>
<li><a class="dropdown-item" href="/help_and_support/bugs_and_suggestions.html">Report a bug</a></li>
<li class="dropdown-divider"></li>
<li class="dropdown-header">Project</li>
<li><a class="dropdown-item" href="/about_jena/about.html">About Jena</a></li>
<li><a class="dropdown-item" href="/about_jena/architecture.html">Architecture</a></li>
<li><a class="dropdown-item" href="/about_jena/citing.html">Citing</a></li>
<li><a class="dropdown-item" href="/about_jena/team.html">Project team</a></li>
<li><a class="dropdown-item" href="/about_jena/contributions.html">Related projects</a></li>
<li><a class="dropdown-item" href="/about_jena/roadmap.html">Roadmap</a></li>
<li><a class="dropdown-item" href="/about_jena/security-advisories.html">Security Advisories</a></li>
<li class="dropdown-divider"></li>
<li class="dropdown-header">ASF</li>
<li><a class="dropdown-item" href="https://www.apache.org/">Apache Software Foundation</a></li>
<li><a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a></li>
<li><a class="dropdown-item" href="https://www.apache.org/licenses/LICENSE-2.0">License</a></li>
<li><a class="dropdown-item" href="https://www.apache.org/security/">Security</a></li>
<li><a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
</ul>
</li>
<li class="nav-item" id="edit"><a class="nav-link" href="https://github.com/apache/jena-site/edit/main/source/documentation/query/algebra.md" title="Edit this page on GitHub"><span class="bi-pencil-square"></span><span class="text-body d-none d-xxl-inline"> Edit this page</span></a></li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-12">
<div id="breadcrumbs">
<ol class="breadcrumb mt-4 p-2 bg-body-tertiary">
<li class="breadcrumb-item"><a href='/documentation'>DOCUMENTATION</a></li>
<li class="breadcrumb-item"><a href='/documentation/query'>QUERY</a></li>
<li class="breadcrumb-item active">ALGEBRA.HTML</li>
</ol>
</div>
<h1 class="title">ARQ - SPARQL Algebra</h1>
<main class="d-flex flex-xl-row flex-column">
<aside class="text-muted align-self-start mb-3 p-0 d-xl-none d-block">
<h2 class="h6 sticky-top m-0 p-2 bg-body-tertiary">On this page</h2>
<nav id="TableOfContents">
<ul>
<li><a href="#viewing-the-algebra-expression-for-a-query">Viewing the algebra expression for a Query</a></li>
<li><a href="#turning-a-query-into-an-algebra-expression">Turning a query into an algebra expression</a></li>
<li><a href="#directly-reading-and-writing-algebra-expression">Directly reading and writing algebra expression</a></li>
<li><a href="#creating-an-algebra-expression-programmatically">Creating an algebra expression programmatically</a></li>
<li><a href="#evaluating-a-algebra-expression">Evaluating a algebra expression</a></li>
</ul>
</nav>
</aside>
<article class="flex-column me-lg-4">
<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>
</article>
<aside class="text-muted align-self-start mb-3 mb-xl-5 p-0 d-none d-xl-flex flex-column sticky-top">
<h2 class="h6 sticky-top m-0 p-2 bg-body-tertiary">On this page</h2>
<nav id="TableOfContents">
<ul>
<li><a href="#viewing-the-algebra-expression-for-a-query">Viewing the algebra expression for a Query</a></li>
<li><a href="#turning-a-query-into-an-algebra-expression">Turning a query into an algebra expression</a></li>
<li><a href="#directly-reading-and-writing-algebra-expression">Directly reading and writing algebra expression</a></li>
<li><a href="#creating-an-algebra-expression-programmatically">Creating an algebra expression programmatically</a></li>
<li><a href="#evaluating-a-algebra-expression">Evaluating a algebra expression</a></li>
</ul>
</nav>
</aside>
</main>
</div>
</div>
</div>
<footer class="bd-footer py-4 py-md-5 mt-4 mt-lg-5 bg-body-tertiary">
<div class="container" style="font-size:80%" >
<p>
Copyright &copy; 2011&ndash;2024 The Apache Software Foundation, Licensed under the
<a href="https://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 src="/js/popper.min.js.js" type="text/javascript"></script>
<script src="/js/bootstrap.min.js" type="text/javascript"></script>
<script src="/js/improve.js" type="text/javascript"></script>
<script type="text/javascript">
(function() {
'use strict'
const links = document.querySelectorAll(`a[href="${window.location.pathname}"]`)
if (links !== undefined && links !== null) {
for (const link of links) {
link.classList.add('active')
let parentElement = link.parentElement
let count = 0
const levelsLimit = 4
while (['UL', 'LI'].includes(parentElement.tagName) && count <= levelsLimit) {
if (parentElement.tagName === 'LI') {
parentElement.querySelector('a:first-child').classList.add('active')
}
parentElement = parentElement.parentElement
count++
}
}
}
})()
</script>
</body>
</html>