blob: 036341a99dfc1846863ae8207dad5de3ed879c3e [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - Extensions in ARQ</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/query/extension.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/query'>QUERY</a></li>
<li class="active">EXTENSION</li>
</ol>
</div>
<h1 class="title">Extensions in ARQ</h1>
<p>There are several ways to extend the ARQ query engine within the
SPARQL syntax.</p>
<ul>
<li><a href="#value-functions">Expression Functions</a> - additional operations in
<code>FILTERS</code>, <code>BIND</code> and <code>SELECT</code> expressions.</li>
<li><a href="#property-functions">Property functions</a> - adding predicates
that introduce custom query stages</li>
<li><a href="#describe-handlers">DESCRIBE handlers</a></li>
<li>Support for
<a href="#match-blank-node-labels">finding blank nodes by label</a></li>
<li><a href="arq-query-eval.html">Extending query evaluation</a> for querying
different storage and inference systems</li>
</ul>
<p>Functions are standard part of SPARQL. ARQ provides
application-written functions and provides a
<a href="library-function.html">function library</a>. Applications can
<a href="writing_functions.html">write and register their own functions</a>.</p>
<p>Property functions provide a way to provide custom matching of
particular predicates. They enable triple matches to be calculated,
rather than just looked up in a RDF graph and they are a way to add
functionality and remain within SPARQL. ARQ has a
<a href="library-propfunc.html">property function library</a>. Applications
can
<a href="writing_propfuncs.html">write and register their own property functions</a>.</p>
<p>The <a href="/documentation/query/text-query.html/">free text support in ARQ</a> is provided by
<a href="http://lucene.apache.org/java/docs/index.html">Lucene</a>, using
property functions.</p>
<h2 id="filter-functions">Filter Functions</h2>
<p>A SPARQL custom function is implementation dependent. Most details
of the ARQ query engine do not have to be understood to write a
function; it is a matter of implementing one interface.  This is
made simpler for many cases by a number of base classes that
provide much of the machinery needed.</p>
<h3 id="function-registry">Function Registry</h3>
<p>Functions can be installed into the function registry by the
application. The function registry is a mapping from URI to a
factory class for functions (each time a function is mentioned in a
query, a new instance is created) and there is an auto-factory
class so just registering a Java class will work. A function can
access the queried dataset.</p>
<h3 id="dynamically-loaded-functions">Dynamically Loaded Functions</h3>
<p>The ARQ function library uses this mechanism.  The namespace of the
ARQ function library is <code>&lt;http://jena.apache.org/ARQ/function#&gt;</code>.</p>
<pre><code>PREFIX afn: &lt;http://jena.apache.org/ARQ/function#&gt;
PREFIX dc: &lt;http://purl.org/dc/elements/1.1/&gt;
SELECT ?v {
?x dc:date ?date .
FILTER (?date &lt; afn:now() )
}
</code></pre>
<p>The afn:now returns the time the query started.</p>
<p>The expression functions in the ARQ distribution are described on the
<a href="library-function.html">expression function library page</a>.</p>
<p>URIs for functions in the (fake)
<a href="java-uri.html">URI scheme <code>java:</code></a> are dynamically loaded. The
class name forms the scheme specific part of the URI.</p>
<h2 id="property-functions">Property functions</h2>
<p>Property functions, sometimes called &ldquo;magic properties&rdquo;, are
properties that cause triple matching to happen by executing some
piece of code, determined by the property URI, and not by the usual
graph matching. They can be used to give certain kinds of inference
and rule processing. Some calculated properties have additional,
non-declarative requirements such as needing one of other of the
subject or object to be a query constant or a bound value, and not
able to generate all possibilities for that slot.</p>
<p>Property functions must have fixed URI for the predicate (it can&rsquo;t
be query variable). They may take a list for subject or object.</p>
<p>One common case is for access to collections (RDF lists) or
containers (rdf:Bag, rdf:Seq, rdf:Alt).</p>
<pre><code>PREFIX list: &lt;http://jena.apache.org/ARQ/list#&gt;
SELECT ?member {
?x :p ?list . # Some way to find the list
?list list:member ?member .
}
</code></pre>
<p>which can also be written:</p>
<pre><code>PREFIX list: &lt;http://jena.apache.org/ARQ/list#&gt;
SELECT ?member {
?x :p [ list:member ?member ]
}
</code></pre>
<p>Likewise, RDF containers:</p>
<pre><code>PREFIX rdfs: &lt;http://www.w3.org/2000/01/rdf-schema#&gt;
SELECT ?member {
?x :p ?bag . # Some way to find the bag
?bag rdfs:member ?member .
}
</code></pre>
<p>Property functions can also take lists in the subject or object
slot.</p>
<p>Code for properties can be dynamically loaded or pre-registered.
For example, <code>splitIRI</code> will take an IRI and assign the namespace
ad localname parts to variables (if the variables are already
bound, not constants are used, <code>splitIRI</code> will check the values).</p>
<pre><code>PREFIX xsd: &lt;http://www.w3.org/2001/XMLSchema#&gt;
PREFIX apf: &lt;java:org.apache.jena.query.pfunction.library.&gt;
SELECT ?namespace ?localname {
xsd:string apf:splitIRI (?namespace ?localname)
}
</code></pre>
<p>Property functions might conflict with inference rules and it can
be turned off by the Java code:</p>
<pre><code> ARQ.setFalse(ARQ.enablePropertyFunctions) ;
</code></pre>
<p>or on a per instance basis:</p>
<pre><code> try(QueryExecution qExec = ... ) {
qExec.getContext().setFalse(ARQ.enablePropertyFunctions) ;
...
}
</code></pre>
<p>The property functions in the ARQ distribution are described on the
<a href="library-propfunc.html">property function library page</a>.</p>
<p>URIs for functions in the (fake)
<a href="java-uri.html">URI scheme <code>java:</code></a> are dynamically loaded. The
class name forms the scheme specific part of the URI.</p>
<h2 id="describe-handlers">DESCRIBE handlers</h2>
<p>The <code>DESCRIBE</code> result form in SPARQL does not define an exact form
of RDF to return. Instead, it allows the server or query processor
to return what it considers to be an appropriate description of the
resources located. This description will be specific to the domain,
data modelling or application.</p>
<p>ARQ comes with one built-in handler which calculates the blank node
closure of resources found. While suitable for many situations, it
is not general (for example, a <a href="http://www.foaf-project.org/">FOAF</a>
file usually consists of all blank nodes). ARQ allows the
application to replace or add handlers for producing <code>DESCRIBE</code>
result forms.</p>
<p>Application-specific handlers can be added to the
<code>DescribeHandlerRegistry</code>. The handler will be called for each
resource (not literals) identified by the <code>DESCRIBE</code> query.</p>
<h2 id="blank-node-labels">Blank Node Labels</h2>
<p>URIs from with scheme name &ldquo;_&rdquo; (which is illegal) are created as
blank node labels for directly accessing a blank node in the
queried graph or dataset. These are constant terms in the query -
not unnamed variables. Do not confuse these with the standard
qname-like notation for blank nodes in queries. This is not
portable - use with care.</p>
<pre><code>&lt;_:1234-5678-90&gt; # A blank node in the data
_:b0 # A blank node in the query - a variable
</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>