| <!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-icons.css" rel="stylesheet" media="screen"><link rel="stylesheet" type="text/css" href="https://jena.apache.org/sass/jena.1b17c39a117e22b46db4c66f6395dc27c134a60377d87d2d5745b8600eb69722.css" integrity="sha256-GxfDmhF+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/extension.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">EXTENSION.HTML</li>
|
|
|
|
|
|
|
|
|
| </ol>
|
|
|
|
|
|
|
| |
| </div> |
| <h1 class="title">Extensions in ARQ</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="#filter-functions">Filter Functions</a> |
| <ul> |
| <li><a href="#function-registry">Function Registry</a></li> |
| <li><a href="#dynamically-loaded-functions">Dynamically Loaded Functions</a></li> |
| </ul> |
| </li> |
| <li><a href="#property-functions">Property functions</a></li> |
| <li><a href="#describe-handlers">DESCRIBE handlers</a></li> |
| <li><a href="#blank-node-labels">Blank Node Labels</a></li> |
| </ul> |
| </nav> |
| </aside> |
| <article class="flex-column me-lg-4"> |
| <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><http://jena.apache.org/ARQ/function#></code>.</p> |
| <pre><code>PREFIX afn: <http://jena.apache.org/ARQ/function#> |
| PREFIX dc: <http://purl.org/dc/elements/1.1/> |
| SELECT ?v { |
| ?x dc:date ?date . |
| FILTER (?date < 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 “magic properties”, 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’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: <http://jena.apache.org/ARQ/list#> |
| 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: <http://jena.apache.org/ARQ/list#> |
| SELECT ?member { |
| ?x :p [ list:member ?member ] |
| } |
| </code></pre> |
| <p>Likewise, RDF containers:</p> |
| <pre><code>PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> |
| 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: <http://www.w3.org/2001/XMLSchema#> |
| PREFIX apf: <java:org.apache.jena.query.pfunction.library.> |
| 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 “_” (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><_:1234-5678-90> # A blank node in the data |
| |
| _:b0 # A blank node in the query - a variable |
| </code></pre> |
| |
| </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="#filter-functions">Filter Functions</a> |
| <ul> |
| <li><a href="#function-registry">Function Registry</a></li> |
| <li><a href="#dynamically-loaded-functions">Dynamically Loaded Functions</a></li> |
| </ul> |
| </li> |
| <li><a href="#property-functions">Property functions</a></li> |
| <li><a href="#describe-handlers">DESCRIBE handlers</a></li> |
| <li><a href="#blank-node-labels">Blank Node Labels</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 © 2011–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> |