blob: c31228c653f631e1e71710d0cbb355b1352db22d [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - Jena Query Builder - A query builder for Jena.</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/extras/querybuilder/__index.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/extras'>EXTRAS</a></li>
<li class="active">QUERYBUILDER</li>
</ol>
</div>
<h1 class="title">Jena Query Builder - A query builder for Jena.</h1>
<h1 id="table-of-contents">Table of Contents</h1>
<p>{% toc %}</p>
<h1 id="overview">Overview</h1>
<p>Query Builder provides implementations of Ask, Construct, Select and Update builders that allow developers to create queries without resorting to StringBuilders or similar solutions. The Query Builder module is an extra package and is found in the <code>jena-querybuilder</code> jar.</p>
<p>Each of the builders has a series of methods to define the query. Each method returns the builder for easy chaining. The example:</p>
<pre><code>SelectBuilder sb = new SelectBuilder()
.addVar( &quot;*&quot; )
.addWhere( &quot;?s&quot;, &quot;?p&quot;, &quot;?o&quot; );
Query q = sb.build() ;
</code></pre>
<p>produces</p>
<pre><code>SELECT *
WHERE
{ ?s ?p ?o }
</code></pre>
<h1 id="constructing-expressions">Constructing Expressions</h1>
<p>Expressions are primarily used in <code>filter</code> and <code>bind</code> statements as well as in select clauses. All the standard expressions are implemented in the <code>ExprFactory</code> class. An <code>ExprFactory</code> can be retrieved from any Builder by calling the <code>getExprFactory()</code> method. This will create a Factory that has the same prefix mappings and the query. An alternative is to construct the <code>ExprFactory</code> directly, this factory will not have the prefixes defined in <code>PrefixMapping.Extended</code>.</p>
<pre><code>SelectBuilder builder = new SelectBuilder();
ExprFactory exprF = builder.getExprFactory()
.addPrefix( &quot;cf&quot;,
&quot;http://vocab.nerc.ac.uk/collection/P07/current/CFSN0023/&quot;)
builder.addVar( exprF.floor( ?v ), ?floor )
.addWhere( ?s, &quot;cf:air_temperature&quot;, ?v )
</code></pre>
<h1 id="update-builder">Update Builder</h1>
<p>The <code>UpdateBuilder</code> is used to create <code>Update</code>, <code>UpdateDeleteWhere</code> or <code>UpdateRequest</code> objects. When an <code>UpdateRequest</code> is built is contains a single <code>Update</code> object as defined by the <code>UpdateBuilder</code>. <code>Update</code> objects can be added to an UpdateRequest using the <code>appendTo()</code> method.</p>
<pre><code>Var subj = Var.alloc( &quot;s&quot; );
Var obj = Var.alloc( &quot;o&quot; );
UpdateBuilder builder = new UpdateBuilder( PrefixMapping.Standard)
.addInsert( subj, &quot;rdfs:comment&quot;, obj )
.addWhere( subj, &quot;dc:title&quot;, obj);
UpdateRequest req = builder.buildRequest();
UpdateBuilder builder2 = new UpdateBuilder()
.addPrefix( &quot;dc&quot;, &quot;http://purl.org/dc/elements/1.1/&quot;)
.addDelete( subj, &quot;?p&quot;, obj)
.where( subj, dc:creator, &quot;me&quot;)
.appendTo( req );
</code></pre>
<h1 id="where-builder">Where Builder</h1>
<p>In some use cases it is desirable to create a where clause without constructing an entire query. The <code>WhereBuilder</code> is designed to fit this need. For example to construct the query:</p>
<pre><code>PREFIX rdfs: &lt;http://www.w3.org/2000/01/rdf-schema#&gt;
PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/&gt;
SELECT ?page ?type WHERE
{
?s foaf:page ?page .
{ ?s rdfs:label &quot;Microsoft&quot;@en . BIND (&quot;A&quot; as ?type) }
UNION
{ ?s rdfs:label &quot;Apple&quot;@en . BIND (&quot;B&quot; as ?type) }
}
</code></pre>
<p>You could use a WhereBuilder to construct the union queries and add them to a Select or other query builder.</p>
<pre><code>WhereBuilder whereBuilder = new WhereBuilder()
.addPrefix( &quot;rdfs&quot;, &quot;http://www.w3.org/2000/01/rdf-schema#&quot; )
addWhere( &quot;?s&quot;, &quot;rdfs:label&quot;, &quot;'Microsoft'@en&quot; )
.addBind( &quot;'A'&quot;, &quot;?type&quot;)
.addUnion( new WhereBuilder()
.addPrefix( &quot;rdfs&quot;, &quot;http://www.w3.org/2000/01/rdf-schema#&quot; )
.addWhere( &quot;?s&quot;, &quot;rdfs:label&quot;, &quot;'Apple'@en&quot; )
.addBind( &quot;'B'&quot;, &quot;?type&quot;)
);
SelectBuilder builder = new SelectBuilder()
.addPrefix( &quot;rdfs&quot;, &quot;http://www.w3.org/2000/01/rdf-schema#&quot; )
.addPrefix( &quot;foaf&quot;, &quot;http://xmlns.com/foaf/0.1/&quot; );
.addVar( &quot;?page&quot;)
.addVar( &quot;?type&quot; )
.addWhere( &quot;?s&quot;, &quot;foaf:page&quot;, &quot;?page&quot; )
.addWhere( whereBuilder );
</code></pre>
<p>The where clauses could be built inline as:</p>
<pre><code>SelectBuilder builder = new SelectBuilder()
.addPrefixs( PrefixMapping.Standard )
.addPrefix( &quot;foaf&quot;, &quot;http://xmlns.com/foaf/0.1/&quot; );
.addVar( &quot;?page&quot;)
.addVar( &quot;?type&quot; )
.addWhere( &quot;?s&quot;, &quot;foaf:page&quot;, &quot;?page&quot; )
.addWhere( new WhereBuilder()
.addPrefix( &quot;rdfs&quot;, &quot;http://www.w3.org/2000/01/rdf-schema#&quot; )
.addWhere( &quot;?s&quot;, &quot;rdfs:label&quot;, &quot;'Microsoft'@en&quot; )
.addBind( &quot;'A'&quot;, &quot;?type&quot;)
.addUnion( new WhereBuilder()
.addPrefix( &quot;rdfs&quot;, &quot;http://www.w3.org/2000/01/rdf-schema#&quot; )
.addWhere( &quot;?s&quot;, &quot;rdfs:label&quot;, &quot;'Apple'@en&quot; )
.addBind( &quot;'B'&quot;, &quot;?type&quot;)
)
);
</code></pre>
<h1 id="template-usage">Template Usage</h1>
<p>In addition to making it easier to build valid queries the QueryBuilder has a clone method.
Using this a developer can create as &ldquo;Template&rdquo; query and add to it as necessary.</p>
<p>For example using the above query as the &ldquo;template&rdquo; with this code:</p>
<pre><code>SelectBuilder sb2 = sb.clone();
sb2.addPrefix( &quot;foaf&quot;, &quot;http://xmlns.com/foaf/0.1/&quot; )
.addWhere( ?s, RDF.type, &quot;foaf:Person&quot;) ;
</code></pre>
<p>produces</p>
<pre><code>PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/&gt;
SELECT *
WHERE
{ ?s ?p ?o .
?s &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; foaf:person .
}
</code></pre>
<h1 id="prepared-statement-usage">Prepared Statement Usage</h1>
<p>The query builders have the ability to replace variables with other values. This can be</p>
<pre><code>SelectBuilder sb = new SelectBuilder()
.addVar( &quot;*&quot; )
.addWhere( &quot;?s&quot;, &quot;?p&quot;, &quot;?o&quot; );
sb.setVar( Var.alloc( &quot;?o&quot; ), NodeFactory.createURI( &quot;http://xmlns.com/foaf/0.1/Person&quot; ) ) ;
Query q = sb.build();
</code></pre>
<p>produces</p>
<pre><code>SELECT *
WHERE
{ ?s ?p &lt;http://xmlns.com/foaf/0.1/Person&gt; }
</code></pre>
</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>