blob: 406a8bc7bbb74d776def1e066c27a8d21c2843f8 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - ARQ - Generate JSON from SPARQL</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/generate-json-from-sparql.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">GENERATE JSON FROM SPARQL</li>
</ol>
</div>
<h1 class="title">ARQ - Generate JSON from SPARQL</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="#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="https://www.w3.org/TR/2013/REC-sparql11-results-json-20130321/">query results in
JSON format</a>. What is
described in this page is not that format, but an extension of Apache Jena, which allows
users to define how results should be returned in a key/value pair fashion, providing
this way a simpler output. This output can be easily used as model for web applications,
or inspecting data.</p>
<p>Compare the output of this extension:</p>
<pre><code>[
{
&quot;book&quot;: &quot;http://example.org/book/book6&quot;,
&quot;title&quot;: &quot;Harry Potter and the Half-Blood Prince&quot;
},
{
&quot;book&quot;: &quot;http://example.org/book/book7&quot;,
&quot;title&quot;: &quot;Harry Potter and the Deathly Hallows&quot;
},
]
</code></pre>
<p>With the output of the SPARQL 1.1 query result JSON format below:</p>
<pre><code>{
&quot;head&quot;: { &quot;vars&quot;: [ &quot;book&quot; , &quot;title&quot; ]
} ,
&quot;results&quot;: {
&quot;bindings&quot;: [
{
&quot;book&quot;: { &quot;type&quot;: &quot;uri&quot; , &quot;value&quot;: &quot;http://example.org/book/book6&quot; } ,
&quot;title&quot;: { &quot;type&quot;: &quot;literal&quot; , &quot;value&quot;: &quot;Harry Potter and the Half-Blood Prince&quot; }
} ,
{
&quot;book&quot;: { &quot;type&quot;: &quot;uri&quot; , &quot;value&quot;: &quot;http://example.org/book/book7&quot; } ,
&quot;title&quot;: { &quot;type&quot;: &quot;literal&quot; , &quot;value&quot;: &quot;Harry Potter and the Deathly Hallows&quot; }
}
]
}
}
</code></pre>
<p>This feature was added in Jena 3.8.0.</p>
<h2 id="query-syntax">Query Syntax</h2>
<p>The <code>JSON</code> syntax is similar in certain ways to the SPARQL <code>CONSTRUCT</code> syntax.</p>
<pre><code>PREFIX purl: &lt;http://purl.org/dc/elements/1.1/&gt;
PREFIX w3: &lt;http://www.w3.org/2001/vcard-rdf/3.0#&gt;
PREFIX : &lt;http://example.org/book/&gt;
JSON {
&quot;author&quot;: ?author,
&quot;title&quot;: ?title
}
WHERE
{
?book purl:creator ?author .
?book purl:title ?title .
FILTER (?author = 'J.K. Rowling')
}
</code></pre>
<p>As in <code>CONSTRUCT</code>, users are able to specify how the output must look like, using a simple
key/value pair pattern, which could produce the following output for the query above.</p>
<pre><code>[
{
&quot;author&quot; : &quot;J.K. Rowling&quot; ,
&quot;title&quot; : &quot;Harry Potter and the Deathly Hallows&quot;
}
{
&quot;author&quot; : &quot;J.K. Rowling&quot; ,
&quot;title&quot; : &quot;Harry Potter and the Philosopher's Stone&quot;
}
{
&quot;author&quot; : &quot;J.K. Rowling&quot; ,
&quot;title&quot; : &quot;Harry Potter and the Order of the Phoenix&quot;
}
{
&quot;author&quot; : &quot;J.K. Rowling&quot; ,
&quot;title&quot; : &quot;Harry Potter and the Half-Blood Prince&quot;
}
]
</code></pre>
<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>JsonQuery</td>
<td>::=</td>
<td>JsonClause ( DatasetClause )* WhereClause SolutionModifier</td>
</tr>
<tr>
<td>JsonClause</td>
<td>::=</td>
<td>&lsquo;JSON&rsquo; &lsquo;{&rsquo; JsonObjectMember ( &lsquo;,&rsquo; JsonObjectMember )* &lsquo;}&rsquo;</td>
</tr>
<tr>
<td>JsonObjectMember</td>
<td>::=</td>
<td>String &lsquo;:&rsquo; ( Var | RDFLiteral | NumericLiteral | BooleanLiteral )</td>
</tr>
</tbody>
</table>
<p><code>DatasetClause</code>, <code>WhereClause</code>, <code>SolutionModifier</code>, <code>String</code>, <code>Var</code>, &lsquo;RDFLiteral&rsquo;,
<code>NumericLiteral</code>, and &lsquo;BooleanLiteral&rsquo; 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 JSON.</p>
<pre><code>Iterator&lt;JsonObject&gt; QueryExecution.execJsonItems()
JsonArray QueryExecution.execJson()
</code></pre>
<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)
String queryString = &quot;JSON { 'name' : ?name, 'age' : ?age } WHERE ... &quot;
...
Iterator&lt;JsonObject&gt; json = qexec.execJsonItems()
</code></pre>
<h2 id="fuseki-support">Fuseki Support</h2>
<p>Users are able to use Fuseki web interface, as well as the other HTTP endpoints to submit
queries using any programming language. The following example shows how to POST to the query
endpoint passing the query as a form data field.</p>
<pre><code>curl -XPOST --data &quot;query=JSON { 'name' : ?name, 'age': ?age } WHERE { ... }&quot; http://localhost:3030/ds/query
</code></pre>
<p>The web interface editor parses the SPARQL implementation syntax, so syntax errors are expected
in the web editor at this moment when using the <code>JSON</code> clause. The query should still be correctly
executed, and the results displayed as with other normal SPARQL queries.</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="#query-syntax">Query Syntax</a>
<ul>
<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>