<!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>
