Builtin SPARQL functions
Besides the functions built in the SPARQL 1.1 syntax, type casts and functional properties, TinySPARQL supports a number of SPARQL functions. Some of these functions have correspondences in XPath.
String functions
fn:lower-case
fn:lower-case (?string)
Converts a string to lowercase, equivalent to LCASE
.
fn:upper-case
fn:upper-case (?string)
Converts a string to uppercase, equivalent to UCASE
.
fn:contains
fn:contains (?haystack, ?needle)
Returns a boolean indicating whether ?needle
is
found in ?haystack
. Equivalent to CONTAINS
.
fn:starts-with
fn:starts-with (?string, ?prefix)
Returns a boolean indicating whether ?string
starts with ?prefix
. Equivalent to STRSTARTS
.
fn:ends-with
fn:ends-with (?string, ?suffix)
Returns a boolean indicating whether ?string
ends with ?suffix
. Equivalent to STRENDS
.
fn:substring
fn:substring (?string, ?startLoc)
fn:substring (?string, ?startLoc, ?endLoc)
Returns a substring delimited by the integer
?startLoc
and ?endLoc
arguments. If ?endLoc
is omitted, the end of the string is used.
fn:concat
fn:concat (?string1, ?string2, ..., ?stringN)
Takes a variable number of arguments and returns a string concatenation
of all its returned values. Equivalent to CONCAT
.
fn:string-join
fn:string-join ((?string1, ?string2, ...), ?separator)
Takes a variable number of arguments and returns a string concatenation
using ?separator
to join all elements.
fn:replace
fn:replace (?string, ?regex, ?replacement)
fn:replace (?string, ?regex, ?replacement, ?flags)
Performs string replacement on ?string
. All
matches of ?regex
are replaced by ?replacement
in
the returned string. This function is similar to REPLACE
.
The ?flags
argument is optional, a case search
is performed if not provided.
If ?flags
contains the character “s”
, a dot metacharacter (“.”) in
?regex
matches all characters, including newlines. Without it,
newlines are excluded.
If ?flags
contains the character “m”
, the “start of line”
(^
) and “end of line” ($
) constructs match immediately following or
immediately before any newline in the string. If not set these constructs
will respectively match the start and end of the full string.
If ?flags
contains the character “i”
, search is caseless.
If ?flags
contains the character “x”
, ?regex
is
interpreted to be an extended regular expression.
tracker:case-fold
tracker:case-fold (?string)
Converts a string into a form that is independent of case.
tracker:title-order
tracker:title-order (?string)
Manipulates a string to remove leading articles for sorting
purposes, e.g. “Wall, The”. Best used in ORDER BY
clauses.
tracker:ascii-lower-case
tracker:ascii-lower-case (?string)
Converts an ASCII string to lowercase, equivalent to LCASE
.
tracker:normalize
tracker:normalize (?string, ?option)
Normalizes ?string
. The ?option
string must be one of
nfc
, nfd
, nfkc
or nfkd
.
tracker:unaccent
tracker:unaccent (?string)
Removes accents from a string.
tracker:coalesce
tracker:coalesce (?value1, ?value2, ..., ?valueN)
Picks the first non-null value. Equivalent to COALESCE
.
tracker:strip-punctuation
tracker:strip-punctuation (?string)
Removes any Unicode character which has the General Category value of P (Punctuation) from the string.
DateTime functions
fn:year-from-dateTime
fn:year-from-dateTime (?date)
Returns the year from a xsd:date
type, a xsd:dateTime
type, or a ISO8601 date string. This function is equivalent
to YEAR
.
fn:month-from-dateTime
fn:month-from-dateTime (?date)
Returns the month from a xsd:date
type, a xsd:dateTime
type, or a ISO8601 date string. This function is equivalent to MONTH
.
fn:day-from-dateTime
fn:day-from-dateTime (?date)
Returns the day from a xsd:date
type, a xsd:dateTime
type, or a ISO8601 date string. This function is equivalent to DAY
.
fn:hours-from-dateTime
fn:hours-from-dateTime (?date)
Returns the hours from a xsd:dateTime
type or a ISO8601
datetime string. This function is equivalent to HOURS
.
fn:minutes-from-dateTime
fn:minutes-from-dateTime (?date)
Returns the minutes from a xsd:dateTime
type
or a ISO8601 datetime string. This function is equivalent to
MINUTES
.
fn:seconds-from-dateTime
fn:seconds-from-dateTime (?date)
Returns the seconds from a xsd:dateTime
type
or a ISO8601 datetime string. This function is equivalent to
SECONDS
.
fn:timezone-from-dateTime
fn:timezone-from-dateTime (?date)
Returns the timezone offset in minutes. This function is similar, but
not equivalent to TIMEZONE
or TZ
.
Full-text search functions
fts:rank
fts:rank (?match)
Returns the rank of a full-text search match. Must be
used in conjunction with fts:match
.
fts:offsets
fts:offsets (?match)
Returns a string describing the offsets of a full-text search
match. Must be used in conjunction with fts:match
. The returned
string has the format:
prefix:property:offset prefix:property:offset prefix:property:offset
fts:snippet
fts:snippet (?match)
fts:snippet (?match, ?delimStart, ?delimEnd)
fts:snippet (?match, ?delimStart, ?delimEnd, ?ellipsis)
fts:snippet (?match, ?delimStart, ?delimEnd, ?ellipsis, ?numTokens)
Returns a snippet string in accordance to the full-text search string.
Must be used in conjunction with fts:match
.
The ?delimStart
and ?delimEnd
parameters allow specifying the
delimiters of the match strings inside the snippet.
The ?ellipsis
parameter allows specifying
the string used to separate distant matches in the snippet string.
The ?numTokens
parameter specifies the number
of tokens the returned string should containt at most.
URI functions
tracker:uri-is-parent
tracker:uri-is-parent (?parent, ?uri)
Returns a boolean value expressing whether
?parent
is a parent of ?uri
.
tracker:uri-is-descendant
tracker:uri-is-descendant (?uri1, ?uri2, ..., ?uriN, ?child)
Returns a boolean value expressing whether one of the
given URIs are a parent (direct or indirect) of
?child
.
tracker:string-from-filename
tracker:string-from-filename (?filename)
Returns a UTF-8 string from a filename.
Geolocation functions
tracker:cartesian-distance
tracker:cartesian-distance (?lat1, ?lat2, ?lon1, ?lon2)
Calculates the cartesian distance between 2 points expressed
by ?lat1 / ?lon1
and ?lat2 / ?lon2
.
tracker:haversine-distance
tracker:haversine-distance (?lat1, ?lat2, ?lon1, ?lon2)
Calculates the haversine distance between 2 points expressed
by ?lat1 / ?lon1
and ?lat2 / ?lon2
.
Identification functions
tracker:id
tracker:id (?urn)
Returns the internal ID corresponding to a URN.
Its inverse operation is tracker:uri
.
tracker:uri
tracker:uri (?id)
Returns the URN that corresponds to an ID.
Its inverse operation is tracker:id
Full-text search
Full-text search (FTS) is a built-in feature of TinySPARQL, it allows for efficient search of individual terms across large collections of text.
String properties are not searchable through the full-text index by default, only properties with the nrl:fulltextIndexed property enabled can be searched with FTS.
# Enable FTS search on the example:title property
example:title a rdf:Property;
rdfs:range xsd:string ;
nrl:fulltextIndexed true .
Multiple full-text indexed properties may be defined, either in the same or different classes.
In order to tap into the full-text search index, the SPARQL
query must use the fts:match
pseudo-property, e.g.:
SELECT ?res { ?res fts:match "term1 term2" }
This property will match the resources that match the search terms, independently of the order and separation between those terms in the searched text. Any full-text indexed property is candidate for these matches.
In order to complement this pseudo-property, there are additional functions to extract more information from the full-text index:
- fts:rank to get a ranking order for the matched
element. To be used in
ORDER BY
clauses. - fts:offsets to get a list of offsets of the lookup terms as found in the searched text.
- fts:snippet to get a short string representation of the lookup terms in the searched text.
These functions work on each of the matches provided by fts:match
,
the following example puts all FTS features together at work:
# Get resource IRI, snippet and match offsets of every
# document matching "GNOME"
SELECT
?u
fts:snippet(?u)
fts:offsets(?u)
{
?u a nfo:Document ;
fts:match "GNOME" .
}
ORDER BY DESC (fts:rank(?u))
Full-text search is case insensitive, and the content of its
index may be subject to stemming,
stop word lists and other
methods of pre-processing, these settings may changed via the
TrackerSparqlConnectionFlags
set on a local connection.