blob: b4d5334fe170dfafad446cde8d6ecb10a1196d01 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - Property Functions 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&#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/library-propfunc.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">LIBRARY PROPFUNC</li>
</ol>
</div>
<h1 class="title">Property Functions 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="#property-function-library">Property Function Library</a></li>
</ul>
</nav>
</aside>
<article class="flex-column me-lg-4">
<p>SPARQL allows custom property functions to add functionality to the
triple matching process. Property functions can be
<a href="extension.html">registered or dynamically loaded</a>.</p>
<p>See also the <a href="text-query.html">free text search</a> page.</p>
<p>See also the FILTER functions
<a href="library-function.html">FILTER functions library</a>.</p>
<p>Applications can also <a href="writing_propfuncs.html">provide their own property functions</a>.</p>
<h2 id="property-function-library">Property Function Library</h2>
<p>The prefix <code>apf</code> is <code>&lt;http://jena.apache.org/ARQ/property#&gt;</code>.
(The old prefix of <code>&lt;http://jena.hpl.hp.com/ARQ/property#&gt;</code> continues to
work. Applications are encouraged to switch.)</p>
<p>Direct loading using a URI prefix of
<code>&lt;java:org.apache.jena.sparql.pfunction.library.&gt;</code> (note the final
dot) also works.</p>
<p>The prefix <code>list:</code> is <code>http://jena.apache.org/ARQ/list#</code>.</p>
<table>
<tr><th>Property name</th><th>Description</th></tr>
<tr><td>
<i><code>list</code> </i><code>list:member</code> <i><code>member</code></i>
</td><td>
Membership of an RDF List (RDF Collection). If <i>list</i> is not bound
or a constant, find and iterate all lists in the graph (can be
slow) else evaluate for one particular list. If <i>member</i> a
variable, generate solutions with <i>member</i> bound to each element in
the list. If <i>member</i> is bound or a constant expression, test to
see if a member of the list.
</td></tr>
<tr><td>
<code><i>list </i>list:index <i>(index member)</i></code>
</td><td>
Index of an RDF List (RDF Collection). If <i>list</i> is not bound or a
constant, find and iterate all lists in the graph (can be slow)
else evaluate for one particular list. The object is a list pair,
either element can be bound, unbound or a fixed node. Unbound
variables in the object list are bound by the property function.
</td></tr>
<tr><td>
<code><i>list </i>list:length <i>length</i></code>
</td><td>
Length of an RDF List (RDF Collection). If <i>list</i> is not bound or a
constant, find and iterate all lists in the graph (can be slow)
else evaluate for one particular list. The object is tested against
or bound to the length of the list.
</td></tr>
<tr><td>
<code><i>container </i>rdfs:member <i>member</i></code>
</td><td>
Membership of an RDF Container (rdf:Bag, rdf:Seq, rdf:Alt).
Pre-registered URI. If this infers with queries running over a Jena
inference model which also provides <code>rdfs:member</code>, then remove this
from the global registry.
<code> PropertyFunctionRegistry.get().<br> remove(RDFS.member.getURI()) ;</code>
</td></tr>
<tr><td>
<code>apf:textMatch</code>
</td><td>
Free text match.
</td></tr>
<tr><td>
<code><i>bag </i>apf:bag <i>member</i></code>
</td><td>
The argument <i>bag</i> must be bound by this point in the query or a
constant expression. If <i>bag</i> is bound or a URI, and <i>member</i> a
variable, generate solutions with <i>member</i> bound to each element in
the bag. If <i>member</i> is bound or a constant expression, test to see
if a member of the list.
</td><tr>
<tr><td>
<code><i>seq</i> apf:seq <i>member</i></code>
</td><td>
The argument <i>seq</i> must be bound by this point in the query or a
constant expression. If <i>seq</i> is bound or a URI, and <i>member</i> a
variable, generate solutions with <i>member</i> bound to each element in
the sequence. If <i>member</i> is bound or a constant expression, test
to see if a member of the list.
</td><tr>
<tr><td>
<code><i>seq</i> apf:alt <i>member</i></code>
</td><td>
The argument <i>alt</i> must be bound by this point in the query or a
constant expression. If <i>alt</i> is bound or a URI, and <i>member</i> a
variable, generate solutions with <i>member</i> bound to each element in
the alt . If <i>member</i> is bound or a constant expression, test to
see if a member of the list.
</td><tr>
<tr><td>
<i><code>varOrTerm</code></i><code>apf:assign</code><i><code>varOrTerm</code></i>
</td><td>
Assign an RDF term from one side to the other. If both are fixed
RDF terms or bound variables, it becomes a boolean test that the
subject is the same RDF term as the object.
</td><tr>
<tr><td>
<i><code>iri</code></i><code>apf:splitIRI (<i>namespace</i> <i>localname</i>)</code><br />
<i><code>iri</code></i><code>apf:splitURI (<i>namespace</i> <i>localname</i>)</code>
</td><td>
Split the IRI or URI into namespace (an IRI) and local name (a
string). Compare if given values or bound variables, otherwise set
the variable. The object is a list with 2 elements.
<code>splitURI</code> is an synonym.
</td><tr>
<tr><td>
<code><i>subject</i> apf:str <i>object</i></code>
</td><td>
The <i>subject</i> is the string form of the <i>object</i>, like the function
str().
<i>Object</i> must be bound or a constant. <i>Object</i> can not be a blank
node (see <code>apf:blankNode</code>)
</td><tr>
<tr><td>
<code><i>subject</i> apf:blankNode <i>label</i><br/>
<code><i>subject</i> apf:bnode <i>label</i><br></td></code>
</td><td>
<i>Subject</i> must be bound to a blank node or a constant. <i>Label</i> is
either a string, in which case test for whether this is the blank
node label of <i>subject</i>, or it is a variable, which is assigned the
blank node label as a plain string. Argument mismatch causes no
match. Use with care.
</td><tr>
<tr><td>
<code><i>subject</i> apf:versionARQ <i>version</i><br> <br> </code>
</td><td>
Set the <i>subject</i> to the IRI for ARQ and set the object to the
version string (format "N.N.N" where N is a number). If any of the
variables are already set, test for the correct value.
</td><tr>
<tr><td>
<code><i>var</i> apf:concat <i>(arg arg ...)</i></code>
</td><td>
Concatenate the arguments in the object list as strings, and
assign to <code><i>var</i></code>.
</td><tr>
<tr><td>
<code><i>var</i> apf:strSplit <i>(arg arg)</i></code>
</td><td>
Split a string and return a binding for each result. The subject variable should be unbound. The first argument to the
object list is the string to be split. The second argument to the object list is a regular expression by which to split the string.
The subject <code><i>var</i></code> is bound for each result of the split, and each result has the whitespace trimmed from it.
</td><tr>
</table>
<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="#property-function-library">Property Function Library</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>