SPARQL Service Extension#

Abstract#

This document presents extensions of SPARQL service implemented in Corese.

Introduction#

In a SERVICE clause, Corese allows for the addition of URL parameters to the service URL. These parameters are used to tune the behaviour of the service. For example, we can specify the format of the query result returned by the service.

For example, the following query will make Corese write a trace of the execution of the query in its logs:

http://corese.inria.fr/sparql?mode=debug&query=select * {?s ?p ?o}

Prefix used in this document.#

prefix st:  <http://ns.inria.fr/sparql-template/>
prefix stm: <http://ns.inria.fr/sparql-template/navlab#>
prefix d3:  <http://ns.inria.fr/sparql-template/d3#>

Server URL Parameter#

Standard parameters#

In this section, we consider endpoint URL parameters decoded by a SPARQL endpoint receiving an HTTP request.

Standard endpoint URL parameters are available.

query
default-graph-uri 
named-graph-uri

Currently corese does not implement the Update parameters below. Users can use query parameters listed above instead.

update
using-graph-uri 
using-named-graph-uri

Shorthand format parameters#

format specifies query result format when HTTP Accept header cannot be set. For example, format=json is equivalent to: header "Accept: application/sparql-results+json".

For SELECT and ASK queries:

format = json   | xml 

For SELECT, ASK, DESCRIBE and CONSTRUCT queries:

format = jsonld | rdfxml | turtle

Trace parameter#

It is possible to specify several kinds of traces of execution.

mode = debug | trace 

For example, for the query SELECT * { ?s ?p ?o } LIMIT 1 the normal trace is:

[datetime] INFO  webservice.SPARQLRestAPI.getTriplesXMLForGet:311 [] - getTriplesXMLForGet
[datetime] INFO  webservice.SPARQLResult.getResultFormat:90 [] - Endpoint URL: http://localhost:8080/sparql
[datetime] INFO  webservice.SPARQLResult.getResultFormat:96 [] - Query: SELECT * { ?s ?p ?o } LIMIT 1
[datetime] INFO  webservice.EventManager.log:72 [] - Workflow Context:
st:remoteHost : "[0:0:0:0:0:0:0:1]"
st:service : "http://ns.inria.fr/sparql-template/default"
request : "[org.eclipse.jetty.server.Request:Request(GET http://localhost:8080/sparql?query=SELECT%20*%20%7B%20?s%20?p%20?o%20%7D%20LIMIT%201)@429f0053]"^^dt:pointer
url : <http://localhost:8080/sparql>
user query: true
level: PRIVATE

[datetime] INFO  webservice.EventManager.log:73 [] - {st:count="[Map: size=2]"^^dt:map, st:date="[Map: size=2]"^^dt:map, st:host="[Map: size=2]"^^dt:map, st:hostlite="[Map: size=1]"^^dt:map}
[datetime] INFO  webservice.EventManager.log:74 [] - {st:sparql=2, "http://ns.inria.fr/sparql-template/default"=17}
[datetime] INFO  webservice.EventManager.log:76 [] - {"127.0.0.1"=11}

The debug parameter change the trace in the following:

[datetime] INFO  webservice.SPARQLRestAPI.getTriplesXMLForGet:311 [] - getTriplesXMLForGet
[datetime] INFO  webservice.SPARQLResult.getResultFormat:90 [] - Endpoint URL: http://localhost:8080/sparql
[datetime] INFO  webservice.SPARQLResult.getResultFormat:96 [] - Query: SELECT * { ?s ?p ?o } LIMIT 1
[datetime] INFO  webservice.EventManager.log:72 [] - Workflow Context:
debug : true
st:remoteHost : "[0:0:0:0:0:0:0:1]"
st:service : "http://ns.inria.fr/sparql-template/default"
mode : "("debug" )"^^dt:list
request : "[org.eclipse.jetty.server.Request:Request(GET http://localhost:8080/sparql?query=SELECT%20*%20%7B%20?s%20?p%20?o%20%7D%20LIMIT%201&mode=debug)@5c192889]"^^dt:pointer
url : <http://localhost:8080/sparql>
user query: true
level: PRIVATE

[datetime] INFO  webservice.EventManager.log:73 [] - {st:count="[Map: size=2]"^^dt:map, st:date="[Map: size=2]"^^dt:map, st:host="[Map: size=2]"^^dt:map, st:hostlite="[Map: size=1]"^^dt:map}
[datetime] INFO  webservice.EventManager.log:74 [] - {st:sparql=2, "http://ns.inria.fr/sparql-template/default"=18}
[datetime] INFO  webservice.EventManager.log:76 [] - {"127.0.0.1"=11}
select [NODE {?s }, NODE {?p }, NODE {?o }]
QUERY {
AND {
  EDGE {?s ?p ?o} } }
[datetime] WARN  tool.Message.log:64 [] - Eval: 00 AND {
EDGE {?s ?p ?o} }
[datetime] WARN  tool.Message.log:64 [] - Loop: 3 1
[datetime] INFO  webservice.SPARQLResult.getFormat:411 [] - transform: null

The trace parameter change the trace in the following:

[datetime] INFO  webservice.SPARQLRestAPI.getTriplesXMLForGet:311 [] - getTriplesXMLForGet
[datetime] INFO  webservice.SPARQLResult.getResultFormat:90 [] - Endpoint URL: http://localhost:8080/sparql
[datetime] INFO  webservice.SPARQLResult.getResultFormat:96 [] - Query: SELECT * { ?s ?p ?o } LIMIT 1
Endpoint HTTP Request
header: Accept: */*
header: User-Agent: Wget/1.21.3
header: Connection: keep-alive
header: Host: localhost:8080
header: Accept-Encoding: identity
param: query=SELECT * { ?s ?p ?o } LIMIT 1
param: mode=trace
[datetime] INFO  webservice.EventManager.log:72 [] - Workflow Context:
st:remoteHost : "[0:0:0:0:0:0:0:1]"
st:service : "http://ns.inria.fr/sparql-template/default"
mode : "("trace" )"^^dt:list
request : "[org.eclipse.jetty.server.Request:Request(GET http://localhost:8080/sparql?query=SELECT%20*%20%7B%20?s%20?p%20?o%20%7D%20LIMIT%201&mode=trace)@11b799cb]"^^dt:pointer
trace : true
url : <http://localhost:8080/sparql>
user query: true
level: PRIVATE

[datetime] INFO  webservice.EventManager.log:73 [] - {st:count="[Map: size=2]"^^dt:map, st:date="[Map: size=2]"^^dt:map, st:host="[Map: size=2]"^^dt:map, st:hostlite="[Map: size=1]"^^dt:map}
[datetime] INFO  webservice.EventManager.log:74 [] - {st:sparql=2, "http://ns.inria.fr/sparql-template/default"=19}
[datetime] INFO  webservice.EventManager.log:76 [] - {"127.0.0.1"=11}
SPARQL endpoint
select * 
where {
  ?s ?p ?o .
}
limit 1 
01 ?s = <http://linkedgeodata.org/ontology/RailwayConstruction>; ?p = rdf:type; ?o = owl:Class; 

service result: 
<?xml version="1.0" ?>
<sparql xmlns='http://www.w3.org/2005/sparql-results#'>
<head>
<variable name='s'/>
<variable name='p'/>
<variable name='o'/>
</head>
<results>
<result>
<binding name='s'><uri>http://linkedgeodata.org/ontology/RailwayConstruction</uri></binding>
<binding name='p'><uri>http://www.w3.org/1999/02/22-rdf-syntax-ns#type</uri></binding>
<binding name='o'><uri>http://www.w3.org/2002/07/owl#Class</uri></binding>
</result>
</results>
</sparql>

Client URL Parameter#

In this section we consider service URL parameters decoded by SPARQL service interpreter when calling a service.

service <url?param=value> { BGP }

Such parameters are used to modify the way the Corese server will interact with the remote service. For example, we can specify the format of the query result returned by the service.

Standard parameters#

Standard dataset uri parameters are available. Hence we can specify a dataset for a service.

default-graph-uri = uri
named-graph-uri   = uri

HTTP method#

method specifies HTTP GET or POST method for calling the service.

method = get | post

header cna be used to specify any HTTP header parameter.

header=name:value

For example, to specify the HTTP Accept header:

SELECT * { 
    ?s ?p ?o . 
    SERVICE <http://examp.le/sparql?header=Accept:application/json> { 
        ?o a ?c 
    } 
} LIMIT 1

This previous query is equivalent to the usage of format=json. format can be used to specify the HTTP Accept header. Specify the format of the service query result returned by the endpoint using content negotiation.

format = xml | json

Trace mode#

mode in client URL parameter is equivalent to mode in server URL parameter. It specifies the trace mode of the service. It add to the trace trace intermediate results of service, and shows the string result returned by service.

mode = debug | trace

The trap mode “traps” syntax error when parsing service query results and in case of an error, return a subset of results if possible.

mode = trap

Bindings#

Bindings values transmission#

binding specifies the syntax used for variable bindings sent with the service. Variable bindings are the results of intermediate statement evaluation that can be passed as argument of the service.

binding = filter | values 

binding=filter generates bindings with the following syntax:

filter (?x = x1 && ?y = y1)

binding=values generates bindings with the following syntax:

values (?x ?y) { (x1 y1) }

For example, with the following data in the local endpoint:

@prefix : <http://example.org/> .

ex:John :name "John" .

if the following query is executed:

PREFIX : <http://example.org/>
SELECT ?x ?age {
    ?x :name ?name .
    SERVICE <http://example.org/sparql?binding=values> {
        ?x :name ?name ;
            :age ?age .
    }
}

then the query sent to the remote endpoint will be:

PREFIX : <http://example.org/>
SELECT * {
    VALUES ?name { "John" }
    ?x :name ?name ;
        :age ?age .
}

Bindings variable selection#

focus and skip specify variables that must or must not be passed as variable bindings to the service.

focus=x
skip=y

Bindings in-scope#

In order to have their bindings passed into a service clause, variables must be in-scope in the service statement. When a variable is not in-scope, it is possible to make it in-scope with a values expression in the service statement.

values var { undef }

Binding slicing#

Specify the size of the slice of intermediate results variable bindings sent with the service. Default is 20 sets of variable bindings (i.e. from 20 intermediate results).

slice = integer

Specify a limit for the number of results returned by the service.

limit = integer

Specify a timeout in millisecond for the service.

timeout = 123

Exotic Extension#

Any parameter value can be a LDScript global variable. The SPARQL interpreter evaluates the variable at runtime and replaces it by its value.

param={?paramValue}

Remote server return an RDF document instead of SPARQL query results. Parse the RDF document, create an RDF graph, evaluate service BGP locally on the RDF graph.

mode=construct

Remote server return a document (e.g. JSON) instead of SPARQL query results. Parse the document using a LDScript function that returns an RDF graph. Evaluate service BGP locally on the graph returned by the function.

wrapper=functionNameURI

Service Log#

Obtain additional information about query execution and query results such as explanation, trace, etc.

Log#

Detailed log of federated query execution returned as Linked Result RDF/Turtle document, with source selection, rewritten query, intermediate query results.

mode=log

Query string returned as Linked Result.

mode=logquery

Explain#

Explain why federated query fail. Save intermediate query and results as Linked Result documents. Return one JSON object that contains the list of URLs of these Linked Results. This mode is processed by corese GUI.

mode=why

Show where query fail: display last executed statement.

mode=explain

Message#

Return a JSON object message as Linked Result. JSON message contain the Context, the date, execution time. It contains also endpoint exceptions and service that fail in case of federated query. Message is displayed by corese GUI. It is possible to obtain a message systematically by specifying the default mode as such (see below).

mode=message

Service Extension#

Endpoint URL Default Parameter#

Define default parameter values for SPARQL endpoint URL in urlprofile.ttl. Mode *, if any, is applied to every service. Parameter “document” is an URL that is added in Query Results “link” tag.

[] st:mode "*" ;
st:param (
("mode" "message") ("document" <http://corese.inria.fr>)
)
.

Define parameter values associated to specific mode.

[] st:mode "map" ;
st:param (("mode" "link") ("transform" stm:mapper)) 
.

Define service URL with predefined parameter values.

<http://localhost:8080/halopendata/psparql>
st:param (("mode" "map"))
.

Federated SPARQL endpoint#

A federated SPARQL endpoint is an endpoint who dispatches a SPARQL query to several endpoints member of a federation. It processes and returns the union of the query results, processing aggregates, if any, on the union of the results. It is equivalent to a query with a union of service clauses on every endpoint of the federation.
A federation is an URL associated to a list of SPARQL endpoints. It is defined using a Turtle format configuration file, as shown below.

<http://corese.inria.fr/d2kab/sparql> a st:Federation ;
st:definition (
<http://147.100.179.235:8082/blazegraph/namespace/AnaEE_sites/sparql>
<https://ico.iate.inra.fr/fuseki/annotation/query> 
<http://taxref-graphdb.i3s.unice.fr/repositories/geco>
)

The idea is that a federation is hidden behind a single SPARQL endpoint URL.
The provenance parameter returns the URL of the target endpoint for each result.

http://corese.inria.fr/d2kab/sparql?mode=provenance&
query=select * where { ?s rdfs:label ?l filter regex(?l, "bio") } limit 10

A variant of federated SPARQL endpoint splits and rewrites the SPARQL query with appropriate service clauses. The endpoint URL is defined with /federate instead of /sparql.

http://corese.inria.fr/d2kab/federate?query=select where {}

Federated endpoint explain mode#

Federated endpoint with mode explain generate Linked Result for source selection query and results, rewritten federated query. Linked Result also for intermediate service call and service results.
It works for federated engine but also for sparql engine with a standard query with services, sent to corese server with /sparql?mode=why.
The interpreter logs intermediate services and results and at the end, in case of mode=why, it generates Linked Results.

Corese GUI display Linked Results in several query panels with their results.
Intermediate service call can be executed again in GUI.
GUI can save and load query results with Linked Result. Hence we can keep track of federated query results during the lifetime of the endpoint because documents are managed on server side in temporary files.

mode=why

Compiler Service#

Compile a federated query as 1) select source query, 2) federated query with service clauses. Return result of select query. Generate two link href documents for select and federated query.

mode=compile

<link href="http://corese.inria.fr/log/select-f"/>
<link href="http://corese.inria.fr/log/rewrite-f"/>

Evaluation Report Service#

A report can be generated for federated query. Report is stored in a document and an URL for this document is stored in the link href tag of the query result.

mode=log

<link href="http://corese.inria.fr/log/log-f1.ttl"/>

Transformation Service#

SPARQL endpoint where the result of the SPARQL query is transformed using an STTL transformation specified using a transform parameter.
There may be several transformation parameters.

Specific transformation URI for sparql query result format.

transform=st:xml | st:json | st:rdf | st:all

Linked Result#

The result of a transformation may be stored in a document and an URL for this document is stored in the link href tag of the query result.

mode=link

<link href="http://corese.inria.fr/log/xml-f2"/>

Transformation#

The stm:mapper transformation generates a map when query solution contains variables “location”, “lat”, and “lon”.

transform=stm:mapper

Transformation d3:chart for graphic chart

transform=d3:chart

Transformation d3:hierarchy for class hierarchy, d3:graphic for graph, d3:all for both.

transform=d3:hierarchy
transform=d3:graphic
transform=d3:all

SHACL Service#

Execution of SHACL shapes and execution of a SPARQL query on the SHACL validation report graph. Parameter shacl-shape-url is the URL of a SHACL document that contains the shapes to be evaluated.

/sparql?
mode=shacl&
uri=shacl-shape-url&
query=select * where { ?report sh:conforms ?b }

Service with Before & After#

Exemple of service where queries are executed before and after the main query. Parameters uri are URL of SPARQL query documents.

mode=before&uri=url1&mode=after&uri=url2