Title: Functions in ARQ
The regular expressions for fan:localname and afn:namespace were incorrect.
SPARQL allows custom functions in expressions so that
queries can be used on domain-specific data. SPARQL defines a
function by URI (or prefixed name) in FILTER expressions. ARQ
provides a function library and supports application-provided
functions. Functions and property functions can be
[registered or dynamically loaded](extension.html).
Applications can also
[provide their own functions](writing_functions.html).
ARQ also provides an implementation the
[Leviathan Function Library](http://www.dotnetrdf.org/leviathan).
### XQuery/XPath Functions and Operators supported
ARQ supports the scalar functions and operators from
"[XQuery 1.0 and XPath 2.0 Functions and Operators v3.1](https://www.w3.org/TR/xpath-functions-3/)".
Functions in involving sequences are not supported.
See [XSD Support](xsd-support.html) for details of datatypes and functions
currently supported. To check the exact current registrations, see
[function/StandardFunctions.java](https://github.com/apache/jena/blob/master/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java).
See also the [property functions](library-propfunc.html) library
page.
### Function Library
The prefix `afn` is ``.
(the old prefix of `` continues to
work. Applications are encouraged to switch.)
Direct loading using a URI prefix of
`` (note the final
dot) is deprecated.
The prefix `fn` is `` (the
XPath and XQuery function namespace).
The prefix `math` is ``.
### Custom Aggregates
The prefix `agg:` is ``.
The statistical aggregates are provided are:
`agg:stdev`, `agg:stdev_samp`, `agg:stdev_pop`,
`agg:variance`, `agg:var_samp`, `agg:var_pop`
These are modelled after SQL aggregate functions `STDEV`, `STDEV_SAMP`, `STDEV_POP`,
`VARIANCE`, `VAR_SAMP`, `VAR_POP`.
These, as keywords, are available in ARQ's extended SPARQL (parse using `Syntax.syntaxARQ`).
### Additional Functions Provided by ARQ
Most of these have equivalents, or near equivalents, in SPARQL or as an
XQuery function and are to be preferred. These ARQ-specific versions remain
for compatibility.
**RDF Graph Functions**
Function name | Description | Alternative
------------- | ----------- | -----------
`afn:bnode(?x)` | Return the blank node label if ?x is a blank node. | `STR(?x)`
`afn:localname(?x)` | The local name of ?x | `REPLACE(STR(?x), "^(.*)(/|#)([^#/]*)$", "$3")`
`afn:namespace(?x)` | The namespace of ?x | `REPLACE(STR(?x), "^(.*)(/|#)([^#/]*)$", "$1")`
The prefix and local name of a IRI is based on splitting the IRI, not on any prefixes in the query or dataset.
**String Functions**
Function name | Description | Alternative
------------- | ----------- | -----------
`afn:sprintf(format, v1, v2, ...)` | Make a string from the format string and the RDF terms.
`afn:substr(string, startIndex [,endIndex])` | Substring, Java style using *`startIndex`* and *`endIndex`*.
`afn:substring` | Synonym for afn:substr
`afn:strjoin(sep, string ...)` | Concatenate string together, with a separator.
`afn:sha1sum(resource)` | Calculate the SHA1 checksum of a literal or URI | `SHA1(STR(resource))`
Notes:
1. Strings in
"[XQuery 1.0 and XPath 2.0 Functions and Operators](http://www.w3.org/TR/xpath-functions-3/)"
start from character position one, unlike Java and C\# where
strings start from zero.
2. The `fn:substring` operation takes an optional length, like C\#
but different from Java, where it is the *endIndex* of the first
character after the substring.
3. `afn:substr` uses Java-style *`startIndex`* and *`endIndex`*.
**Mathematical Functions**
Function name | Description | Alternative
------------- | ----------- | -----------
`afn:min(num1, num2)` | Return the minimum of two numbers | `fn:min`
`afn:max(num1, num2)` | Return the maximum of two numbers | `fn:max`
`afn:pi()` | The value of pi, as an XSD double | `math:pi()`
`afn:e()` | The value of e, as an XSD double | `math:exp(1)`
`afn:sqrt(num)` | The square root of num | `math:sqrt`
**Miscellaneous Functions**
Function name | Description | Alternative
------------- | ----------- | -----------
`afn:now()` | Current time. Actually, the time the query started. | `NOW()`
`afn:sha1sum(resource)` | Calculate the SHA1 checksum | `SHASUM`