Name

cx:sparql — Performs SPARQL queries on RDF datasets.

Synopsis

This step performs SPARQL queries.

Input portPrimarySequenceContent types
source✔   
query  text 
Output portPrimarySequenceContent types
result✔   
Option nameTypeDefault value
content-typexs:string?()
This is an extension step; to use it, your pipeline must include its declaration. For example, by including the extension library with an import at the top of your pipeline:
<p:import href="https://xmlcalabash.com/ext/library/rdf.xpl"/>
Declaration
1 |<p:declare-step xmlns:p="http://www.w3.org/ns/xproc">
  |   <p:input port="source" primary="true"/>
  |   <p:input port="query" content-types="text"/>
  |   <p:output port="result"/>
5 |   <p:option name="content-type" as="xs:string?"/>
  |</p:declare-step>

Description

The cx:sparql step performs SPARQL queries. The content type of the result depends on the content-type option: application/sparql-results+xml for XML (this is the default if no type is specified), application/sparql-results+json for JSON, or application/rdf+thrift for a binary dataset.

Examples

Consider an RDF address book containing hotels and restaurants. A typical entry might look like this:

 1 |<rdf:Description rdf:about="https://so.nwalsh.com/knows/where/adlards">
   |   <rdf:type rdf:resource="http://nwalsh.com/rdf/contacts#Contact"/>
   |   <rdf:type rdf:resource="http://nwalsh.com/rdf/contacts#Place"/>
   |   <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Organization"/>
 5 |   <foaf:name>Adlard’s</foaf:name>
   |   <c:associatedName>Adlard’s</c:associatedName>
   |   <c:category>Places</c:category>
   |   <p:category>Restaurants</p:category>
   |   <v:workAdr rdf:parseType="Resource">
10 |      <rdf:type rdf:resource="http://nwalsh.com/rdf/vCard#Address"/>
   |      <v:street-address>79 Upper St. Giles Street</v:street-address>
   |      <v:locality>Norwich</v:locality>
   |      <v:region>Norfolk</v:region>
   |      <v:postal-code>NR2 1AB</v:postal-code>
15 |      <v:country-name>GB</v:country-name>
   |   </v:workAdr>
   |   <foaf:homepage rdf:resource="http://www.adlards.co.uk/"/>
   |</rdf:Description>

(Sadly, now closed.)

We might query the address book using SPARQL:

 1 |PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
   |PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
   |PREFIX c: <http://nwalsh.com/rdf/contacts#>
   |PREFIX v: <http://nwalsh.com/rdf/vCard#>
 5 |PREFIX p: <http://nwalsh.com/rdf/pim#>
   | 
   |SELECT ?category ?name ?region ?locality
   |WHERE 
   |{
10 |  ?x c:associatedName ?name .
   |  ?x p:category ?category .
   |  ?x p:category "Restaurants" .
   |  ?x v:workAdr ?addr .
   |  ?addr v:country-name "GB" .
15 |  ?addr v:region ?region .
   |  ?addr v:locality ?locality .
   |}

With a pipeline like this one:

 1 |<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
   |                xmlns:cx="http://xmlcalabash.com/ns/extensions"
   |                version="3.0">
   |<p:import href="https://xmlcalabash.com/ext/library/rdf.xpl"/>
 5 |<p:input port="source" primary="true"/>
   |<p:output port="result"/>
   | 
   |<cx:sparql>
   |  <p:with-input port="query" href="../rdf/query.rq"/>
10 |</cx:sparql>
   | 
   |<p:cast-content-type content-type="text/plain"/>
   | 
   |</p:declare-step>

The cx:sparql step can produce XML or JSON results, but for a quick peek, often the simplest thing to do is cast it to text. This produces:

|---------------+-------------------+-------------+---------------------|
| category      | name              | region      | locality            |
|---------------+-------------------+-------------+---------------------|
| Restaurants   | The French Horn   | Berkshire   | Sonning on Thames   |
| Restaurants   | Adlard’s          | Norfolk     | Norwich             |
|---------------+-------------------+-------------+---------------------|