blob: b003f9be356a1e83384a1c9c902fe08852da882b [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - ARQ - Construct Quad</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/construct-quad.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">CONSTRUCT QUAD</li>
</ol>
</div>
<h1 class="title">ARQ - Construct Quad</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="#query-syntax">Query Syntax</a>
<ul>
<li><a href="#complete-form">Complete Form</a></li>
<li><a href="#short-form">Short Form</a></li>
<li><a href="#grammar">Grammar</a></li>
</ul>
</li>
<li><a href="#programming-api">Programming API</a></li>
<li><a href="#fuseki-support">Fuseki Support</a></li>
</ul>
</nav>
</aside>
<article class="flex-column me-lg-4">
<p>The current W3C recommendation of
<a href="http://www.w3.org/TR/sparql11-query/">SPARQL 1.1</a> supports the <a href="http://www.w3.org/TR/sparql11-query/#construct">CONSTRUCT query
form</a>, which returns a single RDF graph specified by a graph template. The
result is an RDF graph formed by taking each query solution in the solution
sequence, substituting for the variables in the graph template, and
combining the triples into a single RDF graph by set union. However, it
does not directly generate quads or
<a href="http://www.w3.org/TR/sparql11-query/#rdfDataset">RDF datasets</a>.<br>
In order to
eliminate this limitation, Jena ARQ extends the grammar of the <code>CONSTRUCT</code>
query form and provides the according components, which brings more
conveniences for the users manipulating RDF datasets with SPARQL.</p>
<p>This feature was added in Jena 3.0.1.</p>
<h2 id="query-syntax">Query Syntax</h2>
<p>A <code>CONSTRUCT</code> template of the SPARQL 1.1 query String is
<a href="http://www.w3.org/TR/turtle/">Turtle</a> format with possible variables. The
syntax for this extension follows that style in ARQ, using
<a href="http://www.w3.org/TR/trig/">TriG</a> plus variables. Just like SPARQL 1.1,
there are 2 forms for ARQ Construct Quad query:</p>
<h3 id="complete-form">Complete Form</h3>
<pre><code>CONSTRUCT {
# Named graph
GRAPH :g { ?s :p ?o }
# Default graph
{ ?s :p ?o }
# Default graph
:s ?p :o
} WHERE {
# SPARQL 1.1 WHERE Clause
...
}
</code></pre>
<p>The default graphs and the named graphs can be constructed within the
<code>CONSTRUCT</code> clause in the above way. Note that, for constructing the named
graph, the token of <code>GRAPH</code> can be optional. The brackets of the triples to
be constructed in the default graph can also be optional.</p>
<h3 id="short-form">Short Form</h3>
<pre><code>CONSTRUCT WHERE {
# Basic dataset pattern (only the default graph and the named graphs)
...
}
</code></pre>
<p>A short form is provided for the case where the template and the pattern
are the same and the pattern is just a basic dataset pattern (no <code>FILTER</code>s
and no complex graph patterns are allowed in the short form). The keyword
<code>WHERE</code> is required in the short form.</p>
<h3 id="grammar">Grammar</h3>
<p>The normative definition of the syntax grammar of the query string is defined in this table:</p>
<table>
<thead>
<tr>
<th>Rule</th>
<th></th>
<th>Expression</th>
</tr>
</thead>
<tbody>
<tr>
<td>ConstructQuery</td>
<td>::=</td>
<td>&lsquo;CONSTRUCT&rsquo; ( ConstructTemplate DatasetClause* WhereClause SolutionModifier | DatasetClause* &lsquo;WHERE&rsquo; &lsquo;{&rsquo; ConstructQuads &lsquo;}&rsquo; SolutionModifier )</td>
</tr>
<tr>
<td>ConstructTemplate</td>
<td>::=</td>
<td>&lsquo;{&rsquo; ConstructQuads &lsquo;}&rsquo;</td>
</tr>
<tr>
<td>ConstructQuads</td>
<td>::=</td>
<td>TriplesTemplate? ( ConstructQuadsNotTriples &lsquo;.&rsquo;? TriplesTemplate? )*</td>
</tr>
<tr>
<td>ConstructQuadsNotTriples</td>
<td>::=</td>
<td>( &lsquo;GRAPH&rsquo; VarOrBlankNodeIri )? &lsquo;{&rsquo; TriplesTemplate? &lsquo;}&rsquo;</td>
</tr>
<tr>
<td>TriplesTemplate</td>
<td>::=</td>
<td>TriplesSameSubject ( &lsquo;.&rsquo; TriplesTemplate? )?</td>
</tr>
</tbody>
</table>
<p><code>DatasetClause</code>, <code>WhereClause</code>, <code>SolutionModifier</code>, <code>TriplesTemplate</code>, <code>VarOrIri</code>,
<code>TriplesSameSubject</code> are as for the <a href="http://www.w3.org/TR/sparql11-query/#grammar">SPARQL 1.1 Grammar</a></p>
<h2 id="programming-api">Programming API</h2>
<p>ARQ provides 2 additional methods in <a href="/documentation/javadoc/arq/org.apache.jena.arq/org/apache/jena/query/QueryExecution.html">QueryExecution</a> for Construct Quad.</p>
<pre><code>Iterator&lt;Quad&gt; QueryExecution.execConstructQuads() // allow duplication
Dataset QueryExecution.execConstructDataset() // no duplication
</code></pre>
<p>One difference of the 2 methods is:
The method of <code>execConstructQuads()</code> returns an <code>Iterator</code> of <code>Quad</code>, allowing duplication.
But <code>execConstructDataset()</code> constructs the desired Dataset object with only unique <code>Quad</code>s.</p>
<p>In order to use these methods, it&rsquo;s required to switch on the query syntax
of ARQ beforehand, when creating the <code>Query</code> object:</p>
<pre><code>Query query = QueryFactory.create(queryString, Syntax.syntaxARQ);
</code></pre>
<p>If the query is supposed to construct only triples, not quads, the triples
will be constructed in the default graph. For example:</p>
<pre><code>String queryString = &quot;CONSTRUCT { ?s ?p ?o } WHERE ... &quot;
...
// The graph node of the quads are the default graph (ARQ uses &lt;urn:x-arq:DefaultGraphNode&gt;).
Iterator&lt;Quad&gt; quads = qexec.execConstructQuads();
</code></pre>
<p>If the query string stands for constructing quads while the method of
<code>exeConstructTriples()</code> are called, it returns only the triples in the
default graph of the <code>CONSTRUCT</code> query template. It&rsquo;s called a &ldquo;projection&rdquo;
on the default graph. For instance:</p>
<pre><code>String queryString = &quot;CONSTRUCT { ?s ?p ?o . GRAPH ?g1 { ?s1 ?p1 ?o1 } } WHERE ...&quot;
...
// The part of &quot;GRAPH ?g1 { ?s1 ?p1 ?o1 }&quot; will be ignored. Only &quot;?s ?p ?o&quot; in the default graph will be returned.
Iterator&lt;Triple&gt; triples = qexec.execConstructTriples();
</code></pre>
<p>More examples can be found at <code>ExampleConstructQuads.java</code> at
<a href="https://github.com/apache/jena/tree/main/jena-examples/src/main/java/arq/examples/constructquads/">jena-examples:arq/examples/constructquads/</a>.</p>
<h2 id="fuseki-support">Fuseki Support</h2>
<p>Jena <a href="/documentation/fuseki2/index.html">Fuseki</a> is also empowered with Construct Quad query as a built-in
function. No more additional configuration is required to switch it on.
Because
<a href="/documentation/javadoc/arq/org.apache.jena.arq/org/apache/jena/sparql/engine/http/QueryEngineHTTP.html">QueryEngineHTTP</a>
is just an implementation of QueryExecution, there&rsquo;s not much difference
for the client users to manipulate the programming API described in the
previous sections, e.g.</p>
<pre><code>String queryString = &quot; CONSTRUCT { GRAPH &lt;http://example/ns#g1&gt; {?s ?p ?o} } WHERE {?s ?p ?o}&quot; ;
Query query = QueryFactory.create(queryString, Syntax.syntaxARQ);
try ( QueryExecution qExec = QueryExecution.service(serviceQuery).query(query).build() ) { // serviceQuery is the URL of the remote service
Iterator&lt;Quad&gt; result = qExec.execConstructQuads();
...
}
...
</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="#query-syntax">Query Syntax</a>
<ul>
<li><a href="#complete-form">Complete Form</a></li>
<li><a href="#short-form">Short Form</a></li>
<li><a href="#grammar">Grammar</a></li>
</ul>
</li>
<li><a href="#programming-api">Programming API</a></li>
<li><a href="#fuseki-support">Fuseki Support</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>