Veuillez consulter la page des errata de ce document, laquelle peut contenir des corrections normatives.
Cf. aussi d'éventuelles traductions.
Copyright © 2006-2007 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
SPARQL (SPARQL Protocol and RDF Query Language) est un langage d'interrogation et un protocole pour RDF. Ce document définit le protocole SPARQL ; il utilise WSDL 2.0 pour décrire un moyen de transporter des interrogations SPARQL vers un service de traitement d'interrogation SPARQL et de retourner les résultats d'interrogation à l'entité qui les a demandés. Ce protocole a été développé par le groupe de travail RDF Data Access du W3C (DAWG), sous l'égide de l'activité Semantic Web comme décrit dans la déclaration d'activité.
Cette section décrit le statut de ce document au moment de sa publication. D'autres documents peuvent venir le remplacer. On peut trouver une liste des publications actuelles du W3C et la dernière version de ce rapport technique dans l'index des rapports techniques du W3C à http://www.w3.org/TR/.
Ceci est une recommandation du W3C.
Ce document a été examiné par des membres du W3C, par des développeurs de logiciels, et par d'autres groupes du W3C et des tiers intéressés, et a été approuvé par le Directeur comme recommandation du W3C. C'est un document stable qui peut être utilisé comme document de référence ou cité par un autre document. Le rôle du W3C en produisant la recommandation est d'attirer l'attention sur la spécification et d'en promouvoir le large déploiement. Cela participe à la fonctionnalité et à l'interopérabilité du Web.
Les commentaires à propos de ce document sont à envoyer à public-rdf-dawg-comments@w3.org, une liste de diffusion avec des archives publiques. Les questions et commentaires à propos de SPARQL non liés à cette spécification, y compris les extensions et les caractéristiques, peuvent être débattus sur la liste de diffusion public-sparql-dev@w3.org (archives publiques).
Ce document a été produit par le groupe de travail RDF Data Access, sous l'égide de l'activité Semantic Web du W3C. La première publication de ce document en tant que version préliminaire a eu lieu le 14 juin 2005, et le groupe de travail a traité beaucoup de commentaires reçus et de problèmes depuis. Il y a eu un seul changement rédactionnel depuis la recommandation proposée de novembre 2007.
Le rapport de mise en œuvre du protocole SPARQL du groupe de travail démontre que les objectifs de mises en œuvre interopérables fixés dans la recommandation candidate d'avril 2006 ont été atteints.
Le groupe de travail Data Access a ajourné 12 questions, dont les fonctions agrégées et un langage de mise à jour.
Ce document a été produit par un groupe agissant sous couvert de la politique de brevets du W3C du 5 février 2004. Le W3C tient une liste publique des divulgations de brevets effectuées en rapport avec les produits livrables du groupe ; cette page contient également des instructions pour divulguer un brevet. Quiconque a connaissance véritable d'un brevet qu'il estime contenir des revendications essentielles doit divulguer cette information conformément à la section 6 de la politique de brevets du W3C.
SparqlQuery
queryqueryqueryquerySELECT avec ensemble de données RDF fourni par le serviceSELECT avec ensemble de données RDF simpleCONSTRUCT avec ensemble de données RDF simple et négociation de contenu HTTPASK avec ensemble de données RDF simpleDESCRIBE avec ensemble de données RDF simpleSELECT avec ensemble de données RDF complexeSELECT avec ensemble de données RDF simple dans l'interrogation uniquementSELECT avec ensemble de données RDF ambiguSELECT avec incident pour interrogation malforméeSELECT avec incident pour requête d'interrogation refuséeSELECT utilisant une liaison POSTSELECT avec internationalisationSELECT avec liaison queryHttpPost et entrée XMLCe document (auto-désigné « Protocole SPARQL pour RDF ») décrit le protocole SPARQL, un moyen de communiquer les interrogations SPARQL de clients d'interrogation (query clients) à des processeurs d'interrogation (query processors). Le protocole SPARQL a été conçu pour être compatible avec le langage d'interrogation SPARQL pour RDF [SPARQL]. Le protocole SPARQL est décrit sous deux aspects : premièrement, comme une interface abstraite indépendante de réalisations, de mises en œuvre ou de liaisons à d'autres protocoles, concrètes ; deuxièmement, comme des liaisons HTTP et SOAP de cette interface. Ce document ainsi que les documents du W3C associés, WSDL et XML Schema, s'adressent principalement aux développeurs de logiciels intéressés par la mise en œuvre de services et de clients d'interrogation SPARQL.
Lorsque ce document utilise les mots-clés DOIT, NE DOIT PAS, DEVRAIT, NE DEVRAIT PAS, PEUT et RECOMMANDÉ, dans ce style, on doit les interpréter selon le RFC 2119 [RFC2119].
Lorsque ce document contient des extraits d'autres documents, incluant des instances WSDL et XML Schema, il utilise les préfixes et adresses URI d'espaces de noms suivants :
| Préfixe | Adresse URI d'espace de noms |
|---|---|
st |
http://www.w3.org/2005/09/sparql-protocol-types/# |
xs |
http://www.w3.org/2001/XMLSchema |
vbr |
http://www.w3.org/2005/sparql-results# |
rdf |
http://www.w3.org/1999/02/22-rdf-syntax-ns# |
whttp |
http://www.w3.org/2006/01/wsdl/http |
wsoap |
http://www.w3.org/2006/01/wsdl/soap |
soap |
http://www.w3.org/2003/05/soap-envelope |
wsdlx |
http://www.w3.org/2005/08/wsdl-extensions |
tns |
http://www.w3.org/2005/08/sparql-protocol-query/# |
Ce jeu de documents constitue la spécification du protocole SPARQL :
Le protocole SPARQL contient une seule interface (SparqlQuery) qui contient à son tour une seule opération
(query). Le protocole SPARQL est décrit de manière abstraite
avec WSDL 2.0 [WSDL2] comme un service web qui met en œuvre son interface,
ses types, ses incidents (faults) et ses opérations, par des liaisons HTTP et SOAP.
Bien que ce document utilise WSDL 2.0 pour décrire le protocole SPARQL, notez qu'il n'y a aucune obligation
pour une mise en œuvre d'utiliser une stratégie de mise en œuvre impliquant l'utilisation d'une quelconque bibliothèque ou d'un
quelconque cadre d'applications de langage de programmation (programming language framework) WSDL.
queryL'interface SparqlQuery est l'unique interface du protocole. Elle contient une seule opération, query,
qui est utilisée pour communiquer une
chaîne d'interrogation SPARQL
(SPARQL query string) et, en option, une description
d'ensemble de données RDF
(RDF dataset).
L'opération query est décrite comme un modèle d'échange de messages In-Out
(In-Out message exchange pattern) [WSDL-Adjuncts]. Les contraintes d'un modèle d'échange de messages In-Out
sont les suivantes :
Ce modèle consiste en deux messages exactement, en ordre, comme suit :
Un message :
indiqué par un composant Interface Message Reference dont la propriété {message label} est "In" et la propriété {direction} est "in" ;
reçu d'un nœud N.
Un message :
indiqué par un composant Interface Message Reference dont la propriété {message label} est "Out" et la propriété {direction} est "out" ;
envoyé au nœud N.
Ce modèle utilise la règle 2.2.1 Fault Replaces Message.
Cette interface et cette opération sont décrits dans le fragment WSDL 2.0 suivant (du fichier protocol-query.wsdl contenant les déclarations d'espaces de noms pertinentes) :
<!-- Abstract SparqlQuery Interface -->
<interface name="SparqlQuery" styleDefault="http://www.w3.org/2006/01/wsdl/style/iri">
<!-- the Interface Faults -->
<fault name="MalformedQuery" element="st:malformed-query"/>
<fault name="QueryRequestRefused" element="st:query-request-refused"/>
<!-- the Interface Operation -->
<operation name="query" pattern="http://www.w3.org/2006/01/wsdl/in-out">
<documentation>The operation is used to convey queries and their results from clients to services and back
again.</documentation>
<input messageLabel="In" element="st:query-request"/>
<output messageLabel="Out" element="st:query-result"/>
<!-- the interface faults are out faults -->
<outfault ref="tns:MalformedQuery" messageLabel="Out"/>
<outfault ref="tns:QueryRequestRefused" messageLabel="Out"/>
</operation>
</interface>Extrait 1.0 — Fragment WSDL 2.0
queryAbstraitement, le contenu du message In de l'opération query de SparqlQuery
est une instance d'un type complexe XML Schema, appelée st:query-request dans l'extrait 1.0,
composée encore de deux parties : une chaîne d'interrogation SPARQL
et zéro ou une description d'ensemble de données RDF.
La chaîne d'interrogation SPARQL, identifiée par query, est
définie par la spécification [SPARQL] comme étant
« une séquence de caractères dans la langue définie par la grammaire [SPARQL], commençant par la production Query ».
L'ensemble de données RDF se compose de zéro ou un graphe RDF par défaut — constitué par
la fusion RDF (RDF merge) des graphes RDF identifiés par zéro ou plus types
default-graph-uri — et de zéro ou plus graphes RDF nommés, identifiés par zéro ou plus types
named-graph-uri. Ceux-ci correspondent respectivement aux mots-clés FROM et FROM NAMED
dans [SPARQL].
Ces types sont définis dans le fragment XML Schema suivant (du fichier protocol-types.xsd) :
<xs:element name="query-request">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="query" type="xs:string">
<xs:annotation>
<xs:documentation>query is an xs:string constrained by the language definition,
http://www.w3.org/TR/rdf-sparql-query/#grammar, as "a sequence of characters in
the language defined by the [SPARQL] grammar, starting with the Query production".</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="unbounded" name="default-graph-uri" type="xs:anyURI"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="named-graph-uri" type="xs:anyURI"/>
</xs:sequence>
</xs:complexType>
</xs:element>Extrait 1.1 — Fragment XML Schema
L'ensemble de données RDF peut être défini dans une interrogation [SPARQL] avec les mots-clés
FROM et FROM NAMED, ou dans le protocole décrit dans ce document, ou dans les deux, dans la chaîne d'interrogation
et dans le protocole.
Au cas où l'interrogation et le protocole indiquent tous deux un ensemble de données RDF,
mais pas le même, alors l'ensemble de données RDF du protocole DOIT
être celui consommé par l'opération query de l'interface SparqlQuery.
Un service conforme au protocole SPARQL PEUT
fournir un ensemble de données RDF par défaut, contre lequel les requêtes d'interrogation SPARQL sont exécutées,
au cas où il n'y aurait pas d'ensemble de données RDF indiqué dans le protocole ou la requête d'interrogation.
Un service conforme au protocole SPARQL PEUT
refuser de traiter une requête d'interrogation qui n'indique pas d'ensemble de données RDF. Enfin,
un service conforme au protocole SPARQL PEUT
refuser de traiter une requête d'interrogation contre un ensemble de données RDF indiqué.
Cf. QueryRequestRefused à la section
2.1.4 Messages d'incidents de query.
Le mot-clé BASE dans la chaîne d'interrogation définit l'adresse IRI de base (Base IRI)
utilisée pour résoudre les adresses IRI relatives, selon la section 5.1.1 Adresse URI de base incorporée au contenu
de Identificateur de ressource uniforme (URI) — Syntaxe générique
[RFC3986]. La section 5.1.2 Adresse URI de base de l'entité encapsulante
définit comment l'adresse IRI de base peut être fournie par un document encapsulant, tel qu'une enveloppe SOAP
avec une directive xml:base. Le protocole SPARQL ne résoud pas les adresses URI d'interrogation, et la
section 5.1.3 n'est donc pas pertinente. Enfin, selon la section 5.1.4, les services à protocole SPARQL doivent
définir leur propre adresse URI de base, laquelle PEUT être l'adresse URI
d'invocation du service.
queryAbstraitement, le contenu du message Out de l'opération query de SparqlQuery
est une instance d'un type complexe XML Schema, appelé query-result dans l'extrait 1.2, composée :
Le type query-result est défini dans ce fragment XML Schema (du fichier
protocol-types.xsd) :
<xs:element name="query-result">
<xs:annotation>
<xs:documentation>The type for serializing query results,
either as XML or RDF/XML.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:choice>
<xs:element maxOccurs="1" ref="vbr:sparql"/>
<xs:element maxOccurs="1" ref="rdf:RDF"/>
</xs:choice>
</xs:complexType>
</xs:element>
Extrait 1.2 — Fragment XML Schema
queryLa spécification [WSDL2-Adjuncts] définit plusieurs règles de propagation d'incident indiquant comment les
incidents et messages d'opérations interagissent. L'opération query emploie la règle
Fault Replaces Message
(N.d.T. l'incident remplace le message) :
« Tout message suivant le premier dans le modèle PEUT être remplacé par un message d'incident, lequel DOIT avoir une direction identique. Le message d'incident DOIT être livré au même nœud cible que le message qu'il remplace, sauf indication contraire d'une extension ou d'une extension de liaison. S'il n'y a pas de chemin vers ce nœud, l'incident DOIT être jeté. »
Ainsi l'opération query contenue dans l'interface SparqlQuery peut retourner à la place du
message Out, soit le message MalformedQuery,
soit le message QueryRequestRefused, lesquels sont tous deux définis dans ce fragment XML Schema (du fichier
protocol-types.xsd) :
<xs:element type="xs:string" name="fault-details">
<xs:annotation>
<xs:documentation> This element contains human-readable information about the fault
returned by the SPARQL query processing service.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="malformed-query">
<xs:complexType>
<xs:all><xs:element minOccurs="0" maxOccurs="1" ref="st:fault-details"/></xs:all>
</xs:complexType>
</xs:element>
<xs:element name="query-request-refused">
<xs:complexType>
<xs:all><xs:element minOccurs="0" maxOccurs="1" ref="st:fault-details"/></xs:all>
</xs:complexType>
</xs:element>
Lorsque la valeur du type query n'est pas une séquence de caractères légale dans le langage défini par la
grammaire SPARQL, on DOIT retourner le message d'incident MalformedQuery
ou QueryRequestRefused. Selon la règle Fault Replaces Message,
si un incident WSDL est retourné, y compris MalformedQuery, on NE DOIT PAS
retourner de message Out.
Lorsque le message d'incident MalformedQuery est retourné, les services de traitement d'interrogation
DOIVENT inclure des informations explicatives, de débogage ou d'autres renseignements complémentaires
destinés à un utilisateur humain via le type fault-details défini dans l'extrait 1.3.
Ce message d'incident WSDL DEVRAIT être retourné lorsqu'un client soumet une requête que
le service refuse de traiter. Le message d'incident QueryRequestRefused n'est pas une indication que le serveur
peut ou non traiter une ou plusieurs requêtes consécutives identiques ni une injonction à un
service SPARQL conforme de retourner d'autres codes d'état HTTP
ou entêtes HTTP appropriés pour la sémantique de [HTTP].
Lorsque le message d'incident QueryRequestRefused est retourné, les services de traitement d'interrogation
DOIVENT inclure des informations explicatives, de débogage ou d'autres renseignements complémentaires
destinés à une interprétation humaine via le type fault-details défini dans l'extrait 1.3.
L'opération query de l'interface SparqlQuery décrite jusqu'ici est une opération abstraite ; elle nécessite
des liaisons de protocoles pour devenir une opération invocable. Les deux sections suivantes de ce document décrivent les
liaisons HTTP et SOAP. Un service conforme au protocole SPARQL
DOIT gérer l'interface SparqlQuery ; si un service à protocole SPARQL
gère les liaisons HTTP, il DOIT les gérer comme décrit dans le fichier
protocol-query.wsdl. Un service à protocole SPARQL
PEUT gérer d'autres interfaces. Cf. la section
2.3 Liaisons SOAP pour plus de renseignements.
La spécification [WSDL2-Adjuncts] définit un moyen de lier des opérations d'interfaces abstraites à HTTP.
Les liaisons HTTP pour l'opération query (d'après le fichier
protocol-query.wsdl) sont les suivantes :
<!-- the HTTP GET binding for query operation -->
<binding name="queryHttpGet" interface="tns:SparqlQuery"
type="http://www.w3.org/2006/01/wsdl/http"
whttp:version="1.1">
<fault ref="tns:MalformedQuery" whttp:code="400"/>
<fault ref="tns:QueryRequestRefused" whttp:code="500"/>
<operation ref="tns:query"
wsdlx:safe="true"
whttp:method="GET"
whttp:faultSerialization="*/*"
whttp:inputSerialization="application/x-www-form-urlencoded"
whttp:outputSerialization="application/sparql-results+xml, application/rdf+xml, */*" />
</binding>
<!-- the HTTP POST binding for query operation -->
<binding name="queryHttpPost" interface="tns:SparqlQuery"
type="http://www.w3.org/2006/01/wsdl/http"
whttp:version="1.1">
<fault ref="tns:MalformedQuery" whttp:code="400"/>
<fault ref="tns:QueryRequestRefused" whttp:code="500"/>
<operation ref="tns:query"
wsdlx:safe="true"
whttp:method="POST"
whttp:faultSerialization="*/*"
whttp:inputSerialization="application/x-www-form-urlencoded, application/xml"
whttp:outputSerialization="application/sparql-results+xml, application/rdf+xml, */*" />
</binding>Il existe deux liaisons HTTP, à savoir queryHttpGet et queryHttpPost, qui sont toutes deux
décrites comme des liaisons de l'interface SparqlQuery. Dans chaque liaison, les deux incidents décrit dans une
interface SparqlQuery, à savoir MalformedQuery et QueryRequestRefused, sont liés
respectivement aux codes d'état HTTP
400 Bad Request et 500 Internal Server Error [HTTP].
On DEVRAIT utiliser la liaison queryHttpGet sauf si les interrogations
codées URL (URL-encoded) excèdent des limites pratiques, auquel cas
on DEVRAIT utiliser la liaison queryHttpPost.
Note informative concernant les contraintes de sérialisation.
La sérialisation en sortie des liaisons queryHttpGet et queryHttpPost est volontairement souscontrainte
afin de tenir compte de la diversité des types de sérialisation des graphes RDF.
La sérialisation des incidents de queryHttpGet et de queryHttpPost l'est également.
Un service conforme au protocole SPARQL
peut fournir des interfaces WSDL et des liaisons de remplacement avec des contraintes différentes.
Cette liaison de l'opération query utilise la méthode GET [HTTP], avec les contraintes de
type de sérialisation suivantes : la valeur de whttp:faultSerialization est */* ; deuxièmement, la valeur
de whttp:inputSerialization est application/x-www-form-urlencoded avec un codage UTF-8 ; et troisièmement,
la valeur de whttp:outputSerialization est application/sparql-results+xml avec un codage UTF-8,
application/rdf+xml avec un codage UTF-8 et */*.
Cette liaison de l'interface query utilise la méthode POST [HTTP], avec les contraintes de
type de sérialisation suivantes : la valeur de whttp:faultSerialization est */* ; deuxièmement, la valeur
de whttp:inputSerialization est application/x-www-form-urlencoded avec un codage UTF-8 et
application/xml avec un codage UTF-8 ; et troisièmement, la valeur de whttp:outputSerialization est
application/sparql-results+xml avec un codage UTF-8, application/rdf+xml avec un codage UTF-8 et
*/*.
Les exemples suivants d'extraits de traces HTTP illustrent l'invocation de l'opération query sous
différents scénarios. Ces exemples de traces sont extraits de traces HTTP complètes en trois façons :
default-graph-uri et de named-graph-uri ne sont pas codées URL.Cette interrogation SPARQL :
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?book ?who
WHERE { ?book dc:creator ?who }
est communiquée au service d'interrogation SPARQL http://www.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery HTTP/1.1 Host: www.example User-agent: my-sparql-client/0.1
Cette interrogation contre l'ensemble de données RDF fourni par le service, exécutée par ce service d'interrogation SPARQL, retourne le résultat d'interrogation suivant :
HTTP/1.1 200 OK
Date: Fri, 06 May 2005 20:55:12 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="book"/>
<variable name="who"/>
</head>
<results distinct="false" ordered="false">
<result>
<binding name="book"><uri>http://www.example/book/book5</uri></binding>
<binding name="who"><bnode>r29392923r2922</bnode></binding>
</result>
...
<result>
<binding name="book"><uri>http://www.example/book/book6</uri></binding>
<binding name="who"><bnode>r8484882r49593</bnode></binding>
</result>
</results>
</sparql>
Cette interrogation SPARQL :
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?book ?who
WHERE { ?book dc:creator ?who }
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.other.example/books HTTP/1.1 Host: www.other.example User-agent: my-sparql-client/0.1
Cette interrogation contre l'ensemble de données RDF identifié par la valeur http://www.other.example/books
du paramètre default-graph-uri, exécutée par ce service d'interrogation SPARQL, retourne le
résultat d'interrogation suivant :
HTTP/1.1 200 OK
Date: Fri, 06 May 2005 20:55:12 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="book"/>
<variable name="who"/>
</head>
...
<results distinct="false" ordered="false">
<result>
<binding name="book"><uri>http://www.example/book/book2</uri></binding>
<binding name="who"><bnode>r1115396427r1133</bnode></binding>
</result>
<result>
<binding name="book"><uri>http://www.example/book/book3</uri></binding>
<binding name="who"><bnode>r1115396427r1133</bnode></binding>
</result>
<result>
<binding name="book"><uri>http://www.example/book/book1</uri></binding>
<binding name="who"><literal>J.K. Rowling</literal></binding>
</result>
</results>
</sparql>
Cette interrogation SPARQL :
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX myfoaf: <http://www.example/jose/foaf.rdf#>
CONSTRUCT { myfoaf:jose foaf:depiction <http://www.example/jose/jose.jpg>.
myfoaf:jose foaf:schoolHomepage <http://www.edu.example/>.
?s ?p ?o.}
WHERE { ?s ?p ?o. myfoaf:jose foaf:nick "Jo".
FILTER ( ! (?s = myfoaf:kendall && ?p = foaf:knows && ?o = myfoaf:edd )
&& ! ( ?s = myfoaf:julia && ?p = foaf:mbox && ?o = <mailto:julia@mail.example> )
&& ! ( ?s = myfoaf:julia && ?p = rdf:type && ?o = foaf:Person))
}
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/jose-foaf.rdf HTTP/1.1 Host: www.example User-agent: sparql-client/0.1 Accept: text/turtle, application/rdf+xml
Et la réponse illustrée ici :
HTTP/1.1 200 OK
Date: Fri, 06 May 2005 20:55:11 GMT
Server: Apache/1.3.29 (Unix)
Connection: close
Content-Type: text/turtle
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix myfoaf: <http://www.example/jose/foaf.rdf#>.
myfoaf:jose foaf:name "Jose Jimeñez";
foaf:depiction <http://www.example/jose/jose.jpg>;
foaf:nick "Jo";
...
foaf:schoolHomepage <http://www.edu.example/>;
foaf:workplaceHomepage <http://www.corp.example/>;
foaf:homepage <http://www.example/jose/>;
foaf:knows myfoaf:juan;
rdf:type foaf:Person.
myfoaf:juan foaf:mbox <mailto:juan@mail.example>;
rdf:type foaf:Person.
Remarque :
L'enregistrement du type de média text/turtle était amorcé mais pas achevé au moment de la publication du document.
Veuillez consulter http://www.w3.org/TeamSubmission/turtle pour le type de média
enregistré final pour le langage Turtle.
Cette interrogation SPARQL :
PREFIX dc: <http://purl.org/dc/elements/1.1/>
ASK WHERE { ?book dc:creator "J.K. Rowling"}
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/books HTTP/1.1 Host: www.example User-agent: sparql-client/0.1
Et la réponse illustrée ici :
HTTP/1.1 200 OK Date: Fri, 06 May 2005 20:48:25 GMT Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3 Connection: close Content-Type: application/sparql-results+xml <?xml version="1.0"?> <sparql xmlns="http://www.w3.org/2005/sparql-results#"> <head></head> <boolean>true</boolean> </sparql>
Cette interrogation SPARQL :
PREFIX books: <http://www.example/book/> DESCRIBE books:book6
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/books HTTP/1.1 Host: www.example User-agent: sparql-client/0.1
Et la réponse illustrée ici :
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/rdf+xml
<?xml version="1.0"?>
<rdf:RDF ...
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:books="http://www.example/book/"
xmlns:dc="http://purl.org/dc/elements/1.1/" >
<rdf:Description rdf:about="http://www.example/book/book6">
<dc:title>Example Book #6 </dc:title>
</rdf:Description>
</rdf:RDF>
Cette interrogation SPARQL :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?who ?g ?mbox
WHERE { ?g dc:publisher ?who .
GRAPH ?g { ?x foaf:mbox ?mbox }
}
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP (avec des sauts de ligne pour la lisibilité) :
GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/publishers &default-graph-uri=http://www.example/morepublishers&named-graph-uri=http://your.example/foaf-alice &named-graph-uri=http://www.example/foaf-bob&named-graph-uri=http://www.example/foaf-susan &named-graph-uri=http://this.example/john/foaf Host: www.example User-agent: sparql-client/0.1
Et la réponse illustrée ici :
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="who"/>
<variable name="g"/>
<variable name="mbox"/>
</head>
...
<results ordered="false" distinct="false">
<result>
<binding name="who">
<literal>Alice</literal>
</binding>
<binding name="g">
<uri>http://your.example/foaf-alice</uri>
</binding>
<binding name="mbox">
<uri>mailto:alice@example.org</uri>
</binding>
</result>
<result>
<binding name="who">
<literal>Bob</literal>
</binding>
<binding name="g">
<uri>http://www.example/foaf-bob</uri>
</binding>
<binding name="mbox">
<uri>mailto:bob@work.example</uri>
</binding>
</result>
<result>
<binding name="who">
<literal>Susan</literal>
</binding>
<binding name="g">
<uri>http://www.example/foaf-susan</uri>
</binding>
<binding name="mbox">
<uri>mailto:susan@work.example</uri>
</binding>
</result>
<result>
<binding name="who">
<literal>John</literal>
</binding>
<binding name="g">
<uri>http://this.example/john/foaf</uri>
</binding>
<binding name="mbox">
<uri>mailto:john@home.example</uri>
</binding>
</result>
</results>
</sparql>
Cette interrogation SPARQL :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?who ?g ?mbox
FROM <http://www.example/publishers>
FROM NAMED <http://www.example/alice>
FROM NAMED <http://www.example/bob>
WHERE { ?g dc:publisher ?who .
GRAPH ?g { ?x foaf:mbox ?mbox }
}
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery HTTP/1.1 Host: www.example User-agent: sparql-client/0.1
Et la réponse illustrée ici :
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
...
<head>
<variable name="who"/>
<variable name="g"/>
<variable name="mbox"/>
</head>
<results ordered="false" distinct="false">
<result>
<binding name="who">
<literal>Bob Hacker</literal>
</binding>
<binding name="g">
<uri>http://www.example/bob</uri>
</binding>
<binding name="mbox">
<uri>mailto:bob@oldcorp.example</uri>
</binding>
</result>
<result>
<binding name="who">
<literal>Alice Hacker</literal>
</binding>
<binding name="g">
<uri>http://www.example/alice</uri>
</binding>
<binding name="mbox">
<uri>mailto:alice@work.example</uri>
</binding>
</result>
</results>
</sparql>
Cette interrogation SPARQL :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?who ?g ?mbox
FROM <http://www.example/publishers>
FROM NAMED <http://www.example/john>
FROM NAMED <http://www.example/susan>
WHERE { ?g dc:publisher ?who .
GRAPH ?g { ?x foaf:mbox ?mbox }
}
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/morepublishers &named-graph-uri=http://www.example/bob&named-graph-uri=http://www.example/alice HTTP/1.1 Host: www.example User-agent: sparql-client/0.1
Cette opération de protocole contient un ensemble de données RDF ambigu : l'ensemble de données indiqué dans l'interrogation
est différent de celui indiqué dans le protocole (à l'aide des paramètres default-graph-uri et named-graph-uri).
Un service conforme au protocole SPARQL doit résoudre cette ambiguïté en exécutant l'interrogation contre
l'ensemble de données RDF indiqué dans le protocole :
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="who"/>
<variable name="g"/>
<variable name="mbox"/>
</head>
<results ordered="false" distinct="false">
<result>
<binding name="who">
<literal>Bob Hacker</literal>
</binding>
<binding name="g">
<uri>http://www.example/bob</uri>
</binding>
<binding name="mbox">
<uri>mailto:bob@oldcorp.example</uri>
</binding>
</result>
<result>
<binding name="who">
<literal>Alice Hacker</literal>
</binding>
<binding name="g">
<uri>http://www.example/alice</uri>
</binding>
<binding name="mbox">
<uri>mailto:alice@work.example</uri>
</binding>
</result>
</results>
</sparql>
Cette interrogation SPARQL syntaxiquement invalide :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { ?x foaf:name ?name
ORDER BY ?name }
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/morepublishers HTTP/1.1 Host: www.example User-agent: sparql-client/0.1
Et la réponse illustrée ici — l'incident MalformedQuery remplaçant le message Out,
selon la section 2.1 SparqlQuery :
HTTP/1.1 400 Bad Request Date: Wed, 03 Aug 2005 12:48:25 GMT Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3 Connection: close Content-Type: text/plain; charset=UTF-8 4:syntax error, unexpected ORDER, expecting '}'
Cette interrogation SPARQL :
PREFIX bio: <http://bio.example/schema/#>
SELECT ?valence
FROM <http://another.example/protein-db.rdf>
WHERE { ?x bio:protein ?valence }
ORDER BY ?valence
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery&default-graph-uri=http://another.example/protein-db.rdf HTTP/1.1 Host: www.example User-agent: sparql-client/0.1
Et la réponse illustrée ici — l'incident QueryRequestRefused remplaçant le message Out,
selon la section 2.1 SparqlQuery :
HTTP/1.1 500 Internal Server Error Date: Wed, 03 Aug 2005 12:48:25 GMT Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3 Connection: close Content-Type: text/html; charset=UTF-8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>SPARQL Processing Service: Query Request Refused</title> </head> <body> <p> Query Request Refused: your request could not be processed because <code>http://another.example/protein-db.rdf</code> could not be retrieved within the time alloted.</p> </body> </html>
Certaines interrogations SPARQL, générées peut-être automatiquement, sont plus longues que ce qui peut être communiqué avec fiabilité par le biais de la liaison HTTP GET décrite à la section 2.2 Liaisons HTTP. On peut alors utiliser la liaison POST qui y est décrite. Cette interrogation SPARQL :
PREFIX : <http://www.w3.org/2002/12/cal/icaltzd#>
PREFIX Chi: <http://www.w3.org/2002/12/cal/test/Chiefs.ics#>
PREFIX New: <http://www.w3.org/2002/12/cal/tzd/America/New_York#>
PREFIX XML: <http://www.w3.org/2001/XMLSchema#>
SELECT ?summary
WHERE {
{
Chi:D603E2AC-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-09-08T16:00:00"^^New:tz;
:dtstamp "2002-09-06T03:09:27Z"^^XML:dateTime;
:dtstart "2002-09-08T13:00:00"^^New:tz;
:summary ?summary;
:uid "D603E2AC-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D603E90B-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-09-15T16:00:00"^^New:tz;
:dtstamp "2002-09-06T03:10:19Z"^^XML:dateTime;
:dtstart "2002-09-15T13:00:00"^^New:tz;
:summary ?summary;
:uid "D603E90B-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D603ED6E-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-09-22T16:00:00"^^New:tz;
:dtstamp "2002-09-06T03:11:05Z"^^XML:dateTime;
:dtstart "2002-09-22T13:00:00"^^New:tz;
:summary ?summary;
:uid "D603ED6E-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D603F18C-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-09-29T16:00:00"^^New:tz;
:dtstamp "2002-09-06T03:15:46Z"^^XML:dateTime;
:dtstart "2002-09-29T13:00:00"^^New:tz;
:summary ?summary;
:uid "D603F18C-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D603F5B7-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-11-04"^^XML:date;
:dtstamp "2002-09-06T03:12:53Z"^^XML:dateTime;
:dtstart "2002-11-03"^^XML:date;
:summary ?summary;
:uid "D603F5B7-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D603F9D7-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-11-10T20:15:00"^^New:tz;
:dtstamp "2002-09-06T03:14:12Z"^^XML:dateTime;
:dtstart "2002-11-10T17:15:00"^^New:tz;
:summary ?summary;
:uid "D603F9D7-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D604022C-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-11-17T17:00:00"^^New:tz;
:dtstamp "2002-09-06T03:14:51Z"^^XML:dateTime;
:dtstart "2002-11-17T14:00:00"^^New:tz;
:summary ?summary;
:uid "D604022C-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D604065C-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-10-06T19:05:00"^^New:tz;
:dtstamp "2002-09-06T03:16:54Z"^^XML:dateTime;
:dtstart "2002-10-06T16:05:00"^^New:tz;
:summary ?summary;
:uid "D604065C-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D6040A7E-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-10-13T19:15:00"^^New:tz;
:dtstamp "2002-09-06T03:17:51Z"^^XML:dateTime;
:dtstart "2002-10-13T16:15:00"^^New:tz;
:summary ?summary;
:uid "D6040A7E-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D6040E96-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-10-20T16:00:00"^^New:tz;
:dtstamp "2002-09-06T03:18:32Z"^^XML:dateTime;
:dtstart "2002-10-20T13:00:00"^^New:tz;
:summary ?summary;
:uid "D6040E96-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D6041270-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-10-27T17:00:00"^^New:tz;
:dtstamp "2002-09-06T03:19:15Z"^^XML:dateTime;
:dtstart "2002-10-27T14:00:00"^^New:tz;
:summary ?summary;
:uid "D6041270-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D6041673-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-11-24T20:05:00"^^New:tz;
:dtstamp "2002-09-06T03:22:09Z"^^XML:dateTime;
:dtstart "2002-11-24T17:05:00"^^New:tz;
:summary ?summary;
:uid "D6041673-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D6041A73-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-12-01T17:00:00"^^New:tz;
:dtstamp "2002-09-06T03:22:52Z"^^XML:dateTime;
:dtstart "2002-12-01T14:00:00"^^New:tz;
:summary ?summary;
:uid "D6041A73-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D60421EF-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-12-08T17:00:00"^^New:tz;
:dtstamp "2002-09-06T03:24:04Z"^^XML:dateTime;
:dtstart "2002-12-08T14:00:00"^^New:tz;
:summary ?summary;
:uid "D60421EF-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D6042660-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-12-15T20:05:00"^^New:tz;
:dtstamp "2002-09-06T03:25:03Z"^^XML:dateTime;
:dtstart "2002-12-15T17:05:00"^^New:tz;
:summary ?summary;
:uid "D6042660-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D6042A93-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-12-22T17:00:00"^^New:tz;
:dtstamp "2002-09-06T03:25:47Z"^^XML:dateTime;
:dtstart "2002-12-22T14:00:00"^^New:tz;
:summary ?summary;
:uid "D6042A93-C1C9-11D6-9446-003065F198AC" .
}
UNION
{
Chi:D6042EDF-C1C9-11D6-9446-003065F198AC a :Vevent;
:dtend "2002-12-28T21:00:00"^^New:tz;
:dtstamp "2002-09-06T03:26:51Z"^^XML:dateTime;
:dtstart "2002-12-28T18:00:00"^^New:tz;
:summary ?summary;
:uid "D6042EDF-C1C9-11D6-9446-003065F198AC" .
}
}
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
POST /sparql/ HTTP/1.1 Host: www.example User-agent: sparql-client/0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 9461 query=EncodedQuery&default-graph-uri=http://another.example/calendar.rdf
Et la réponse illustrée ici :
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="summary"/>
</head>
<results ordered="false" distinct="false">
<result>
<binding name="summary">
<literal>Chiefs vs. Cleveland @ Cleveland Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. Jacksonville @ Arrowhead Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. New England @ Gillette Stadium</literal>
</binding>
</result>
...
<result>
<binding name="summary">
<literal>Chiefs vs. Miami @ Arrowhead Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>BYE</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. San Francisco @ 49ers Stadium at Candlestick Point</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. Buffalo @ Arrowhead Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. NY Jets @ Giants Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. San Diego @ Qualcomm Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. Denver @ Arrowhead Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. Oakland @ Arrowhead Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. Seattle @ Seahawks Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. Arizona @ Arrowhead Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. St. Louis @ Arrowhead Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. Denver @ INVESCO Field at Mile High</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. San Diego @ Arrowhead Stadium</literal>
</binding>
</result>
<result>
<binding name="summary">
<literal>Chiefs vs. Oakland @ Network Associates Coliseum</literal>
</binding>
</result>
</results>
</sparql>
Les interrogations SPARQL peuvent inclure des caractères ou des jeux de caractères internationalisés. Cette interrogation SPARQL :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX 食: <http://www.w3.org/2001/sw/DataAccess/tests/data/i18n/kanji.ttl#>
SELECT ?name ?food
WHERE { [ foaf:name ?name ; 食:食べる ?food ] . }
est communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
GET /sparql/?query=EncodedQuery Host: www.example User-agent: sparql-client/0.1
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix)
Connection: close
Content-Type: application/sparql-results+xml
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
...
</sparql>
Dans une version future, les interrogations SPARQL pourraient être sérialisées en XML et communiquées à un service d'interrogation SPARQL par le biais de la méthode HTTP POST. Cette interrogation SPARQL :
<?xml version="1.0"?>
<rdf-query xmlns="http://example.org/SparqlX/">
<select><variable name="book"/><variable name="who"/></select>
<query-pattern>
<triple-pattern>
<subject><variable name="book"/></subject>
<predicate><uri>http://purl.org/dc/elements/1.1/creator</uri></predicate>
<object><variable name="who"/></object>
</triple-pattern>
</query-pattern>
</rdf-query>
serait communiquée au service d'interrogation SPARQL http://www.other.example/sparql/ comme illustré dans cette trace HTTP :
POST /sparql/ HTTP/1.1 Host: www.example User-agent: my-sparql-client/0.1 Content-type: application/xml <?xml version="1.0"?> <rdf-query xmlns="http://example.org/SparqlX/"> <select><variable name="book"/><variable name="who"/></select> <query-pattern> <triple-pattern> <subject><variable name="book"/></subject> <predicate><uri>http://purl.org/dc/elements/1.1/creator</uri></predicate> <object><variable name="who"/></object> </triple-pattern> </query-pattern> </rdf-query>
Cette interrogation contre l'ensemble de données RDF fourni par le service, exécutée par ce service d'interrogation SPARQL, retourne le résultat d'interrogation suivant :
HTTP/1.1 200 OK
Date: Fri, 06 May 2005 20:55:12 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml
<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
<head>
<variable name="book"/>
<variable name="who"/>
</head>
<results distinct="false" ordered="false">
<result>
<binding name="book"><uri>http://www.example/book/book5</uri></binding>
<binding name="who"><bnode>r29392923r2922</bnode></binding>
</result>
...
<result>
<binding name="book"><uri>http://www.example/book/book6</uri></binding>
<binding name="who"><bnode>r8484882r49593</bnode></binding>
</result>
</results>
</sparql>
La spécification [WSDL2-Adjuncts] définit un moyen de lier des opérations d'interfaces abstraites au protocole SOAP.
Les liaisons SOAP pour l'opération query (d'après le fichier
protocol-query.wsdl) sont les suivantes :
<binding name="querySoap" interface="SparqlQuery"
type="http://www.w3.org/2006/01/wsdl/soap"
wsoap:version="1.2"
wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP">
<fault ref="tns:MalformedQuery" wsoap:code="soap:Sender" />
<fault ref="tns:QueryRequestRefused" wsoap:code="soap:Sender" />
<operation ref="tns:query" wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response" />
</binding>
Le nom de la liaison SOAP de l'opération query de l'interface SparqlQuery est
querySoap ; c'est une liaison SOAP du fait de la valeur de l'attribut type, qui est affecté
de l'adresse URI identifiant SOAP. La version de SOAP est 1.2.
Le protocole sous-jacent utilisé dans cette liaison SOAP est HTTP, comme déterminé par la valeur URI
de l'attribut wsoap:protocol. Si un service à protocole SPARQL gère les liaisons SOAP
avec l'attribut {http://www.w3.org/2006/01/wsdl/soap, protocol} affecté de la valeur
http://www.w3.org/2003/05/soap/bindings/HTTP, il DOIT gérer les liaisons décrites dans le
fichier protocol-query.wsdl. Les liaisons SOAP avec des
valeurs d'attribut wsoap:protocol d'autres protocoles de transmission que HTTP ne sont pas décrites
dans ce document.
Les deux éléments fault se rapportent aux messages d'incidents définis dans l'interface SparqlQuery.
Enfin, l'élément operation se rapporte à l'opération query de l'interface SparqlQuery décrite
précédemment dans l'extrait 1.0. Puisque cette liaison SOAP décrit l'opération comme utilisant
HTTP pour protocole de transport sous-jacent, la valeur de l'attribut wsoap:mep détermine quelle méthode
HTTP utiliser. Cette opération est décrite comme étant mise en œuvre par un modèle d'échange de messages SOAP
http://www.w3.org/2003/05/soap/mep/request-response, lequel est lié selon la spécification [SOAP], section
7.4 Caractéristiques gérées, à une méthode HTTP POST.
POST /services/sparql-query HTTP/1.1
Content-Type: application/soap+xml
Accept: application/soap+xml, multipart/related, text/*
User-Agent: Axis/1.2.1
Host: www.example
SOAPAction: ""
Content-Length: 438
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<query-request xmlns="http://www.w3.org/2005/09/sparql-protocol-types/#">
<query>SELECT ?z {?x ?y ?z . FILTER regex(?z, 'Harry')}</query>
</query-request>
</soapenv:Body>
</soapenv:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<query-result xmlns="http://www.w3.org/2005/09/sparql-protocol-types/#">
<ns1:sparql xmlns:ns1="http://www.w3.org/2005/sparql-results#">
<ns1:head>
<ns1:variable name="z"/>
</ns1:head>
<ns1:results distinct="false" ordered="false">
<ns1:result>
<ns1:binding name="z">
<ns1:literal>Harry Potter and the Chamber of Secrets</ns1:literal>
</ns1:binding>
</ns1:result>
...
<ns1:result>
<ns1:binding name="z">
<ns1:literal>Harry Potter and the Half-Blood Prince</ns1:literal>
</ns1:binding>
</ns1:result>
<ns1:result>
<ns1:binding name="z">
<ns1:literal>Harry Potter and the Goblet of Fire</ns1:literal>
</ns1:binding>
</ns1:result>
<ns1:result>
<ns1:binding name="z">
<ns1:literal>Harry Potter and the Philosopher's Stone</ns1:literal>
</ns1:binding>
</ns1:result>
<ns1:result>
<ns1:binding name="z">
<ns1:literal>Harry Potter and the Order of the Phoenix</ns1:literal>
</ns1:binding>
</ns1:result>
<ns1:result>
<ns1:binding name="z">
<ns1:literal>Harry Potter and the Prisoner Of Azkaban</ns1:literal>
</ns1:binding>
</ns1:result>
</ns1:results>
</ns1:sparql>
</query-result>
</soapenv:Body>
</soapenv:Envelope>
Il y a au moins deux sources possibles d'attaques par saturation (denial-of-service attacks) contre les services à protocole SPARQL. D'abord, les interrogations insuffisamment contraintes qui se traduisent par un très grand nombre de résultats, dont le traitement, l'assemblage ou le retour peuvent nécessiter une grande consommation des ressources de calcul. Une autre origine possible, les interrogations contenant des descriptions d'ensemble de données RDF très complexes — à cause du volume de la ressource, du nombre des ressources à récupérer, ou une combinaison du volume et du nombre —, que le service est incapable d'assembler sans une consommation importante de ressources, dont la bande passante, le temps d'unité de traitement ou la mémoire auxilliaire (secondary storage). Dans certains cas, une telle consommation peut effectivement constituer une attaque par saturation. Un service à protocole SPARQL PEUT placer des restrictions sur les ressources à récupérer ou sur le débit auquel récupérer les ressources externes. Il peut y avoir d'autres sources d'attaques par saturation contre les services de traitement d'interrogation SPARQL.
Puisqu'un service à protocole SPARQL peut effectuer les requêtes HTTP d'autres serveurs d'origine (origin servers) pour le compte de ses clients, il peut être employé comme vecteur d'attaques à l'encontre d'autres sites ou services. Ainsi, les services à protocole SPARQL peuvent effectivement agir comme serveurs mandataires (proxies) pour des clients tiers. Ces services PEUVENT placer des restrictions sur les ressources à récupérer ou sur le débit auquel récupérer les ressources externes. Les services à protocole SPARQL PEUVENT consigner (log) les requêtes des clients de manière à faciliter leur traçage en rapport aux serveurs d'origine ou services tiers.
Les services à protocole SPARQL PEUVENT choisir de détecter ces attaques et autres interrogations coûteuses ou sinon risquées, d'imposer des limites en temps et en mémoire aux interrogations, ou d'imposer d'autres restrictions afin de réduire la vulnérabilité du service (et des autres services) aux attaques par saturation. Ils PEUVENT aussi refuser de traiter de telles requêtes d'interrogation.
Des adresses IRI peuvent avoir le même aspect. Des caractères dans des écritures différentes peuvent se ressembler (un caractère cyrillique "о" peut ressembler à un caractère latin "o"). Un caractère suivi de caractères combinatoires peut avoir la même représentation visuelle qu'un autre (un caractère LETTRE MINUSCULE LATINE E suivi d'un caractère LETTRE MODIFICATIVE ACCENT AIGU a la même représentation visuelle qu'un caractère LETTRE MINUSCULE LATINE E ACCENT AIGU). Les utilisateurs de SPARQL doivent faire attention de construire des interrogations avec des adresses IRI qui correspondent aux adresses IRI dans les données. On peut trouver plus de renseignements à propos de la comparaison de caractères similaires dans Unicode Security Considerations [UNISEC] et Identificateurs de ressource internationalisés (IRI) [RFC3987], section 8.
Voici le statut des parties du protocole SPARQL pour RDF (ce document) :
Les fichiers protocol-query.wsdl et protocol-types.xsd sont en outre normatifs.
Un service conforme au protocole SPARQL :
SparqlQuery ;query de l'interface SparqlQuery ;query
de la façon décrite dans ce document (« Protocole SPARQL pour RDF ), dans les fichiers
protocol-query.wsdl et
protocol-types.xsd ;query que les liaisons HTTP ou SOAP normatives décrites
par le « Protocole SPARQL pour RDF » ;Nos remerciements aux membres du groupe de travail DAWG, notamment à Bijan Parsia, Bryan Thompson, Andy Seaborne, Steve Harris, Eric Prud'hommeaux, Yoshio FUKUSHIGE, Howard Katz, Dirk-Willem van Gulik, Dan Connolly et Lee Feigenbaum. Des remerciements particuliers sont dus à Elias Torres pour son aide et son soutien généreux. Merci également à nos collègues de l'UMD Jim Hendler, Ron Alford, Amy Alford, Yarden Katz, Chris Testa et aux membres du Mindlab Semantic Web Undergraduate Social. Remerciements particuliers également à notre collègue et ami de la NASA Andy Schain. Nous remercions enfin Jacek Kopecky, Morten Frederiksen, Mark Baker, Jan Algermissen, Danny Ayers, Bernd Simon, Graham Klyne, Arjohn Kampman, Tim Berners-Lee, Dan Brickley, Patrick Stickler, Karl Dubost, Jonathan Marsh, Leigh Dodds, David Wood, Reto Krummenacher, Thomas Roessler, Danny Weitzner, Paul Downey, Hugo Haas, Richard Newman.
Il y a eu un seul changement depuis la recommandation proposée de novembre 2007 :
l'exemple de CONSTRUCT avec ensemble de données RDF simple a été mis à jour pour
utiliser le type de média text/turtle, en notant que l'enregistrement du type de média est en cours.