blob: aec398d6228035f70f9b166ad295cdb7cb9eeace [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - ARQ - Application API</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/app_api.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">APP API</li>
</ol>
</div>
<h1 class="title">ARQ - Application API</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="#key-classes">Key Classes</a></li>
<li><a href="#select-queries">SELECT queries</a>
<ul>
<li><a href="#passing-a-result-set-out-of-the-processing-loop">Passing a result set out of the processing loop.</a></li>
<li><a href="#example-formatting-a-result-set">Example: formatting a result set</a></li>
<li><a href="#example-processing-results">Example: Processing results</a></li>
</ul>
</li>
<li><a href="#construct-queries">CONSTRUCT Queries</a></li>
<li><a href="#describe-queries">DESCRIBE Queries</a></li>
<li><a href="#ask-queries">ASK Queries</a></li>
<li><a href="#formatting-xml-results">Formatting XML results</a></li>
<li><a href="#datasets">Datasets</a></li>
</ul>
</nav>
</aside>
<article class="flex-column me-lg-4">
<p>The application API is in the package <code>org.apache.jena.query</code>.</p>
<p>Other packages contain various parts of the system (execution
engine, parsers, testing etc). Most applications will only need to
use the main package. Only applications wishing to programmatically
build queries or modify the behaviour of the query engine need to
use the others packages directly.</p>
<h2 id="key-classes">Key Classes</h2>
<p>The package <code>org.apache.jena.query</code> is the main application
package.</p>
<ul>
<li><code>Query</code> - a class that represents the application query. It is
a container for all the details of the query. Objects of class
Query are normally created by calling one of the methods of
<code>QueryFactory</code> methods which provide access to the various parsers.</li>
<li><code>QueryExecution</code> - represents one execution of a query.</li>
<li><code>QueryExecutionFactory</code> - a place to get <code>QueryExecution</code> instances.</li>
<li><code>DatasetFactory</code> - a place to make datasets.</li>
<li>For SELECT queries:
<ul>
<li><code>QuerySolution</code> - A single solution to the query.</li>
<li><code>ResultSet</code> - All the QuerySolutions. An iterator.</li>
<li><code>ResultSetFormatter</code> - turn a ResultSet into various forms;
into json, text, or as plain XML.</li>
</ul>
</li>
</ul>
<h2 id="select-queries">SELECT queries</h2>
<p>The basic steps in making a SELECT query are outlined in the
example below. A query is created from a string using the
<code>QueryFactory</code>. The query and model or RDF dataset to be queried
are then passed to <code>QueryExecutionFactory</code> to produce an instance
of a query execution. <code>QueryExecution</code> objects are <code>java.lang.AutoCloseable</code>
and can be used in try-resource. Result are handled in a loop and finally the
query execution is closed.</p>
<pre><code> import org.apache.jena.query.* ;
Model model = ... ;
String queryString = &quot; .... &quot; ;
Query query = QueryFactory.create(queryString) ;
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
ResultSet results = qexec.execSelect() ;
for ( ; results.hasNext() ; )
{
QuerySolution soln = results.nextSolution() ;
RDFNode x = soln.get(&quot;varName&quot;) ; // Get a result variable by name.
Resource r = soln.getResource(&quot;VarR&quot;) ; // Get a result variable - must be a resource
Literal l = soln.getLiteral(&quot;VarL&quot;) ; // Get a result variable - must be a literal
}
}
</code></pre>
<p>It is important to cleanly close the query execution when finished.
System resources connected to persistent storage may need to be
released.</p>
<p>A <code>ResultSet</code> supports the Java iterator interface so the
following is also a way to process the results if preferred:</p>
<pre><code> Iterator&lt;QuerySolution&gt; results = qexec.execSelect() ;
for ( ; results.hasNext() ; )
{
QuerySolution soln = results.next() ;
. . .
}
</code></pre>
<p>The step of creating a query and then a query execution can be
reduced to one step in some common cases:</p>
<pre><code> import org.apache.jena.query.* ;
Model model = ... ;
String queryString = &quot; .... &quot; ;
try (QueryExecution qexec = QueryExecutionFactory.create(queryString, model)) {
ResultSet results = qexec.execSelect() ;
. . .
}
</code></pre>
<h3 id="passing-a-result-set-out-of-the-processing-loop">Passing a result set out of the processing loop.</h3>
<p>A <code>ResultSet</code> is an iterator and can be traversed only once. What is more, much of query execution
and result set processing is handled internally in a streaming fashion. The <code>ResultSet</code> returned
by <code>execSelect</code> is not valid after the <code>QueryExecution</code> is closed,
whether explicitly or by
try-resources as the <code>QueryExecution</code> implements <code>AutoCloseable</code>.</p>
<p>A result set may be materialized - this is then usable outside</p>
<pre><code> try (QueryExecution qexec = QueryExecutionFactory.create(queryString, model)) {
ResultSet results = qexec.execSelect() ;
results = ResultSetFactory.copyResults(results) ;
return results ; // Passes the result set out of the try-resources
}
</code></pre>
<p>The result set from <code>ResultSetFactory.copyResults</code> is a <code>ResultSetRewindable</code> which has a
<code>reset()</code> operation that positions the iterator at the start of the result again.</p>
<p>This can also be used when the results are going to be used in a loop that modifies
the data. It is not possible to update the model or dataset while looping
over the results of a <code>SELECT</code> query.</p>
<p>The models returned by <code>execConstruct</code> and <code>execDescribe</code> are valid
after the <code>QueryExecution</code> is closed.</p>
<h3 id="example-formatting-a-result-set">Example: formatting a result set</h3>
<p>Instead of a loop to deal with each row in the result set, the
application can call an operation of the <code>ResultSetFormatter</code>. This
is what the command line applications do.</p>
<p>Example: processing results to produce a simple text presentation:</p>
<pre><code> ResultSetFormatter fmt = new ResultSetFormatter(results, query) ;
fmt.printAll(System.out) ;
</code></pre>
<p>or simply:</p>
<pre><code> ResultSetFormatter.out(System.out, results, query) ;
</code></pre>
<h3 id="example-processing-results">Example: Processing results</h3>
<p>The results are objects from the Jena RDF API and API calls, which
do not modify the model, can be mixed with query results
processing:</p>
<pre><code> for ( ; results.hasNext() ; )
{
// Access variables: soln.get(&quot;x&quot;) ;
RDFNode n = soln.get(&quot;x&quot;) ; // &quot;x&quot; is a variable in the query
// If you need to test the thing returned
if ( n.isLiteral() )
((Literal)n).getLexicalForm() ;
if ( n.isResource() )
{
Resource r = (Resource)n ;
if ( ! r.isAnon() )
{
... r.getURI() ...
}
}
}
</code></pre>
<p>Updates to the model must be carried out after the query execution
has finished. Typically, this involves collecting results of
interest in a local datastructure and looping over that structure
after the query execution has finished and been closed.</p>
<h2 id="construct-queries">CONSTRUCT Queries</h2>
<p><code>CONSTRUCT</code> queries return a single RDF graph. As usual, the query
execution should be closed after use.</p>
<pre><code>Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
Model resultModel = qexec.execConstruct() ;
qexec.close() ;
</code></pre>
<h2 id="describe-queries">DESCRIBE Queries</h2>
<p><code>DESCRIBE</code> queries return a single RDF graph.
<a href="extension.html#describeHandlers">Different handlers</a> for the
<code>DESCRIBE</code> operation can be loaded by added by the application.</p>
<pre><code>Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
Model resultModel = qexec.execDescribe() ;
qexec.close() ;
</code></pre>
<h2 id="ask-queries">ASK Queries</h2>
<p>The operation Query.execAsk() returns a boolean value indicating
whether the query pattern matched the graph or dataset or not.</p>
<pre><code>Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
boolean result = qexec.execAsk() ;
qexec.close() ;
</code></pre>
<h2 id="formatting-xml-results">Formatting XML results</h2>
<p>The <code>ResultSetFormatter</code> class has methods to write out the
<a href="http://www.w3.org/TR/rdf-sparql-XMLres/">SPARQL Query Results XML Format</a>.
See ResultSetFormatter.outputAsXML method.</p>
<h2 id="datasets">Datasets</h2>
<p>The examples above are all queries on a single model. A SPARQL
query is made on a dataset, which is a default graph and zero or
more named graphs. Datasets can be constructed using the
<code>DatasetFactory</code>:</p>
<pre><code>String dftGraphURI = &quot;file:default-graph.ttl&quot; ;
List namedGraphURIs = new ArrayList() ;
namedGraphURIs.add(&quot;file:named-1.ttl&quot;) ;
namedGraphURIs.add(&quot;file:named-2.ttl&quot;) ;
Query query = QueryFactory.create(queryString) ;
Dataset dataset = DatasetFactory.create(dftGraphURI, namedGraphURIs) ;
try(QueryExecution qExec = QueryExecutionFactory.create(query, dataset)) {
...
}
</code></pre>
<p>Already existing models can also be used:</p>
<pre><code>Dataset dataset = DatasetFactory.create() ;
dataset.setDefaultModel(model) ;
dataset.addNamedModel(&quot;http://example/named-1&quot;, modelX) ;
dataset.addNamedModel(&quot;http://example/named-2&quot;, modelY) ;
try(QueryExecution qExec = QueryExecutionFactory.create(query, dataset)) {
...
}
</code></pre>
<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="#key-classes">Key Classes</a></li>
<li><a href="#select-queries">SELECT queries</a>
<ul>
<li><a href="#passing-a-result-set-out-of-the-processing-loop">Passing a result set out of the processing loop.</a></li>
<li><a href="#example-formatting-a-result-set">Example: formatting a result set</a></li>
<li><a href="#example-processing-results">Example: Processing results</a></li>
</ul>
</li>
<li><a href="#construct-queries">CONSTRUCT Queries</a></li>
<li><a href="#describe-queries">DESCRIBE Queries</a></li>
<li><a href="#ask-queries">ASK Queries</a></li>
<li><a href="#formatting-xml-results">Formatting XML results</a></li>
<li><a href="#datasets">Datasets</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>