SPARQL/Flint :where clauses are written as graph patterns, which describe a selection of RDF triples. The simplest graph pattern, known as a basic graph pattern (BGP) consists of a series of RDF triples.* However, there are a number of clauses that can be used to create more advanced graph patterns:
* Technically a BGP also includes :filter clauses (though not the graph patterns described in the :filter).
:whereReferences: 5. Graph Patterns and 12. Subqueries
A :where clause in Flint is one of two things:
:select query map.Each :where graph pattern is written as either a triple (either as a vector or IGraph normal form map), or as a vector of the form [:keyword & args]. :where patterns can be nested within each other.
Example of a :where clause containing a subquery in a nested :where:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"
:dc "<http://purl.org/dc/elements/1.1/>"}
:select [?person]
:where [[?person :foaf/interest ?doc]
[:where {:select [?doc [(max ?date) ?pubDate]]
:where [[?h :foaf/name "Hange Zoe"]
[?h :foaf/publications ?doc]
[?doc :dc/date ?date]]
:group-by [?doc]}]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?person
WHERE {
?person foaf:interest ?doc .
{
SELECT ?doc (MAX(?date) AS ?pubDate)
WHERE {
?h foaf:name "Hange Zoe" .
?h foaf:publications ?doc .
?doc dc:date ?date .
}
GROUP BY ?doc
}
}
NOTE: Unlike their top-level counterparts, sub-:select queries cannot accept prologue, :from or :from-named clauses.
:optionalReference: 6. Including Optional Values
The :optional keyword specifies graph patterns that do not need to be matched in order to form a query solution. In Flint, an :optional graph pattern has the form [:optional sub-where].
The example:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"}
:select [?firstName ?lastName]
:where [[?x :foaf/givenName ?firstName]
[:optional [[?x :foaf/familyName ?lastName]]]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?firstName ?lastName
WHERE {
?x foaf:firstName ?firstName .
OPTIONAL {
?x foaf:familyName ?lastName .
}
}
:unionReference: 7. Matching Alternatives
The :union keyword specifies taking the union of the results of multiple graph patterns. In Flint, a :union graph pattern has the form [:union sub-where & sub-wheres].
The example:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"}
:select [?x]
:where [[:union [[?x :foaf/name "Historia Reiss"]]
[[?x :foaf/name "Christa Lenz"]]]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?nickName
WHERE {
{
?x foaf:name "Historia Reiss" .
}
UNION
{
?x foaf:name "Christa Lenz" .
}
}
:filterReference: 8.1 Filtering Using Graph Patterns
The :filter keyword is used to exclude results using expressions. In Flint, the :filter keyword is used in the form [:filter expr].
The example:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"}
:select [?name ?age]
:where [[?x :foaf/name ?name]
[?x :foaf/age ?age]
[:filter (<= 18 ?age)]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?age
WHERE {
?x foaf:name ?name .
?x foaf:age ?age .
FILTER (18 <= ?age)
}
:minusReference: 8.2 Removing Possible Solutions
The :minus keyword is used to remove the specified graph pattern from the result set. In Flint, the :minus graph pattern has the form [:minus sub-where].
The example:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"}
:select [?name ?age]
:where [[?x :foaf/name ?name]
[?x :foaf/name ?age]
[:minus [[?x :foaf/name "Jean Kirstein"]]]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?age
WHERE {
?x foaf:name ?name .
?x foaf:age ?age
MINUS {
?x foaf:name "Jean Kirstein" .
}
}
:bindReference: 10.1 BIND: Assigning to Variables
The :bind keyword is used to bind the result of an expression to a variable. In Flint, the :bind keyword is used with an [expr var] form in the form [:bind [expr var]].
The example:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"}
:select [?name ?isAdult]
:where [[?x :foaf/name ?name]
[?x :foaf/age ?age]
[:bind [(<= 18 ?age) ?isAdult]]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?isAdult
WHERE {
?x foaf:name ?name .
?x foaf:age ?age .
BIND ((18 <= ?age) AS ?isAdult)
}
:valuesReference: 10.2 VALUES: Providing inline data
The :values keyword is used to inline values. In Flint, the :values keyword is used in the form [:values values-map].
The example:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"
:food "<http://example.org/food/>"}
:select [?name ?age ?favoriteFood]
:where [{?x {:foaf/name #{?name}
:foaf/age #{?age}}}
[:values {?name ["Sasha Blause" "Connie Springer"]
?favoriteFood [:food/potato nil]}]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX food: <http://example.org/food/>
SELECT ?name ?age ?org ?favoriteFood
WHERE {
?x foaf:name ?name ;
foaf:age ?age .
VALUES (?name ?favoriteFood) {
("Sasha Blause" food:potato)
("Connie Springer" UNDEF)
}
}
See the Modifiers document for more information on :values clauses, including more examples.
:graphReference: 13.3 Querying the Dataset
The :graph keyword is used to specify the named graph that the graph pattern exists in. In Flint, the :graph graph pattern has the form [:graph iri-or-var sub-where].
The example:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"}
:select [?name]
:from-named ["<http://survey-corps.com/graph-data/>"]
:where [[:graph "<http://survey-corps.com/graph-data/>"
[[?x :foaf/name ?name]]]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE {
GRAPH <http://survey-corps.com/graph-data/> {
?x foaf:name ?name .
}
}
:service/:service-silentReference: SPARQL 1.1 Federated Query
The :service keyword is used for federated queries, i.e. queries across networks. The :service-silent variant is used in order to fail silently. In Flint, the :service graph pattern has the form [:service iri-or-var sub-where].
The example:
{:prefixes {:foaf "<http://xmlns.com/foaf/0.1/>"}
:select [?name]
:where [[:service "<http://survey-corps.com/graph-data/remote/>"
[[?x :foaf/name ?name]]]]}
becomes:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE {
SERVICE <http://survey-corps.com/graph-data/remote> {
?x foaf:name ?name .
}
}
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |