The SPARQL 1.1 Subscribe Language defines the content of the following elements: primitives (i.e., subscribe and unsubscribe) and notifications. Every SEPA implementation MUST provide a JSON serialization [[!RFC7159]] of the all these elements. Other kinds of serialization formats MAY be provided. This document refers to the REQUIRED JSON serialization.
The SPARQL 1.1 Subscribe Language is framed within W3C Recommendations as shown in the following figure.
Fig. 1 - The SPARQL Event Processing Architecture (SEPA)
{"subscribe" : { "sparql" : "select * where {?vaimee ?deda ?didi}", "authorization" : "Bearer xabtQWoH8RJJk1FyKJ78J8h8i2PcWmAugfJ4J6nMd+1jVSoiipV4Pcv8bH+8wJLJ2yRaVage8/TzdZJiz2jdRP8bhkuNzFhGx6N1/1mgmvfKihLheMmcU0pLj5uKOYWFb+TB98n1IpNO4G69lia2YoR15LScBzibBPpmKWF+XAr5TeDDHDZQK4N3VBS/e3tFL/yOhkfC9Mw45s3mz83oyeoFFePUX8MQIuqd3TIcjOhoPgYWd0E+L/EN5wItL5/n78pX/8mVZcpxdyNNqr3bVvrCi0I84mIAefwQ0GyPxFhUHu9PtVNQnXchZuFgppX/YDtOesZSxfIoffUpHFPBY3u4FRIYwpSZX96Knnp0J22RQm+0l8yobik3z6jftw0jbF5+/YC6PnfZT3Wzb6PRJPuVkDzpo+BTC9eKx87GEj8VjtfXjbYRTeZNumD+59wL5kV/OrntNqNQD+IzAYoIZk4rlRbNouNnvT0laEhV012tSD1uAfNUxAlZjSbSMTp5bPNp7PoutMr5q6zPYfAC1PTKnVdkD1CDNqZnhB838WDeISfVzXsf7dsZ0+SkNPtx2kMUYCOYsxNJxyzza3lmaCuvxfnDT3g5F41/p/zX1tXYy6emVfdOWSkJNm1z0FJB/ZIUES0WAA5UEM3kejND++vvIQr38ar72HdFzRvP2V29CsaE5PMRRRZIE5ru9Zwgdb5lfMdwDi4sZkQdNRGHiOfRCT9D92mFVps6s6kv7HKojx05R9WKMDG8bEmSgMYSYQlQzLm93Ardw/hpDoB1/DfNRxbc/GVNZEVOoRVMye8/vICZtxvVeKmu4QawWKSBtrXelWUT8AHTG6v/c88pZjtJWDzy6YIIXLDQ2eJPu30mt3gLfS2ukIV4Tl5Oqu3T1IIghmNgek8vwWNeuG/JGeKrfUp6X6mMH9hdmj5+naOIr8V5rUKCjXnlWLAsrGdOvV8vuYYbx2IFQScZQJD/sTKj3gs6yeYpOwQ2iEs9asA=", "alias" : "All", "default-graph-uri" : ["http://example/uri_of_the_default_graph"], "named-graph-uri" : ["http://example/uri_of_a_named_graph"] }}
The value of the
sparql
member MUST be a SPARQL 1.1 Query [[sparql11-query]], the value of
the
authorization
member (if present) MUST be a
Bearer
JSON Web Token [[!RFC7519]] and the value of the
alias
member (if present ) is a string representing a friendly name of the
subscription.
The first member is REQUIRED, while all the other are optional.
The
authorization
member is only REQUIRED for secure operations.
The value of the
alias
member, if present, it will be included in the subscribe response.
The use of the
alias
member is RECOMMENDED if the SEPA client sends multiple subscribe
requests. If needed, the SEPA client MAY store the subscription
alias and link it with the subscription URI [[!RFC3986]] contained
in the subscribe response message.
The value of the
default-graph-uri
and of the
named-graph-uri
(if present) have the same meaning and content of the corresponding
parameters defined in the SPARQL 1.1 Protocol [[sparql11-protocol]]
If the subscribe request is successfully processed, every SEPA implementation MUST respond with a message like the following:
{"notification":{ "spuid" : "sepa://subscription/0d057ca5-cc10-4e8a-a5d9-59d7b36f71d6", "sequence" : 0, "alias" : "All", "addedResults" :{ "head": { "vars": ["vaimee","deda","didi"] }, "results": { "bindings": [{ "vaimee": {"type": "uri", "value" : "http://wot.arces.unibo.it/example#Subject"}, "deda": {"type": "uri", "value": "http://wot.arces.unibo.it/example#Predicate"}, "didi": {"type": "literal","value": "ვაიმეე"} }]}}, "removedResults":{}}}
The value of the
spuid
member is an URI [[!RFC3986]], while the
sequence
member is a number and it will be always 0. Both members MUST be
present. The
sequence
member will be incremented by one on each following notification.
The
alias
member (if present) has the same value of the corresponding
alias
member of the subscribe request.
Eventually, the value of the
addedResults
member corresponds to the results of the SPARQL query according to
the SPARQL 1.1 Query Results JSON format [[sparql11-results-json]],
while the value of the
removedResults
will be always an empty object.
In case of error, it is RECOMMENDED to reply as shown here
A client MAY request to remove a specific subscription. This can be done by sending a message like the following:
{"unsubscribe":{ "spuid":"sepa://subscription/0d057ca5-cc10-4e8a-a5d9-59d7b36f71d6", "authorization" :"Bearer eyJhbGciOiJIUzI....ONFh7HgQ"}}
The
spuid
member value is the subscription URI [[!RFC3986]] provided by the
subscribe response message.
The value of the
authorization
member (if present) MUST be a
Bearer
JSON Web Token [[!RFC7519]].
The former member is REQUIRED, while the latter is only REQUIRED for secure primitives.
A SEPA broker implementation MUST reply to a unsubscribe request with a message like the following:
{"unsubscribed":{ "spuid":"sepa://subscription/0d057ca5-cc10-4e8a-a5d9-59d7b36f71d6"}}
In case of error, it is RECOMMENDED to reply as shown here
An example of a content notification follows:
{"notification":{ "spuid" : "sepa://subscription/0d057ca5-cc10-4e8a-a5d9-59d7b36f71d6", "sequence" : 1, "alias" : "All", "addedResults" :{ "head": { "vars": ["vaimee","deda","didi"] }, "results": { "bindings": [{ "didi": {"type": "literal","value": "ზბკლვვ"} }]}}, "removedResults":{ "head": { "vars": ["vaimee","deda","didi"] }, "results": { "bindings": [{ "didi": {"type": "literal","value": "ვაიმეე"} }]}}}
The value of
spuid
member is the URI [[!RFC3986]] of the subscription who generates the
notification.
The value of the
sequence
member is a number (incremented by one at every new notification of
the same SPUID).
The
addedResults
and
removedResults
are two JSON objects whose content conform with the SPARQL 1.1
Query Results JSON format .
In case of error, a SEPA broker implementation SHOULD reply with a JSON object like the following:
{ "error":"unauthorized_client", "error_description" : "Client is not authorized", "status_code" : 401 }
The
error
member is a string representing the error. Refer to [[!RFC6749]] for
all OAuth related errors. Otherwise it would be a SPARQL 1.1 SE
Protocol specific error string.
The
error_description
member is optional and if present it provides a human readable
description of the error.
The
status_code
member is an integer representing the error. The use of use of HTTP
status codes [[!RFC2616]] is RECOMMENDED. As reference, a list of
common HTTP status codes follows. Implementation specific error codes
MAY also be used.
400 Bad Request 401 Unauthorized 402 Payment Required 403 Forbidden 404 Not Found 405 Method Not Allowed 406 Not Acceptable 407 Proxy Authentication Required 408 Request Timeout 409 Conflict 410 Gone 411 Length Required 412 Precondition Failed 413 Request Entity Too Large 414 Request-URI Too Long 415 Unsupported Media Type 416 Requested Range Not Satisfiable 417 Expectation Failed 500 Internal Server Error 501 Not Implemented 502 Bad Gateway 503 Service Unavailable 504 Gateway Timeout 505 HTTP Version Not Supported
Editors would like to thanks the Advanced Research Center on Electronic Systems "Ercole De Castro" (ARCES) and the Computer Science and Engineering Department (DISI) of the University of Bologna, the European Commission and all the partners of the ARTEMIS projects who inspired the SPARQL Event Processing Architecture (SEPA).