Lisez-moi S.V.P. 

W3C

Protocole SPARQL pour RDF

Recommandation du W3C du 15 janvier 2008

Cette version :
http://www.w3.org/TR/2008/REC-rdf-sparql-protocol-20080115/
Dernière version publiée :
http://www.w3.org/TR/rdf-sparql-protocol/
Version précédente :
http://www.w3.org/TR/2007/PR-rdf-sparql-protocol-20071112/
Rédacteurs :
Kendall Grant Clark, <kendall@monkeyfist.com>, Clark & Parsia LLC
Lee Feigenbaum, <lee@thefigtrees.net>, expert invité
Elias Torres, <eliast@us.ibm.com>, IBM Corporation

Veuillez consulter la page des errata de ce document, laquelle peut contenir des corrections normatives.

Cf. aussi d'éventuelles traductions.


Résumé

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é.

Statut de ce document

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.


Table des matières

1. Introduction

Ce 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/#

2. Protocole SPARQL

Ce jeu de documents constitue la spécification du protocole SPARQL :

Protocole SPARQL pour RDF
Ce document-ci qui définit normativement le protocole SPARQL dans un langage intelligible par un humain.
Description WSDL 2.0 du protocole SPARQL
La description normative du protocole SPARQL en utilisant WSDL 2.0.
Types du protocole SPARQL
Le document XML Schema qui définit normativement les types utilisés dans le 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.

2.1 Interface SparqlQuery

2.1.1 Opération query

L'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 :

  1. 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.

  2. 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

2.1.2 Message In de query

Abstraitement, 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

Définition d'un ensemble de données RDF

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.

Résolution d'un ensemble de données RDF ambigu

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.

Rejet des requêtes d'interrogation sur les ensembles de données RDF

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.

Détermination de l'adresse IRI de base

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.

2.1.3 Message Out de query

Abstraitement, 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 :

  1. soit d'un document de résultats SPARQL (SPARQL Results Document) [SRD] (pour les formes d'interrogation SELECT et ASK de SPARQL pour RDF) ;
  2. soit d'un graphe RDF [RDF-Concepts] sérialisé, par exemple dans la syntaxe RDF/XML [RDF-Syntax], ou une sérialisation de graphe RDF équivalente (pour les formes d'interrogation DESCRIBE et CONSTRUCT de SPARQL pour RDF).

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

2.1.4 Messages d'incidents query

La 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>

Extrait 1.3 — Fragment XML Schema

MalformedQuery

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.

QueryRequestRefused

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.

2.2 Liaisons HTTP

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.

queryHttpGet

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 */*.

queryHttpPost

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 */*.

2.2.1 Exemples HTTP

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 :

  1. Dans chaque exemple, la chaîne "EncodedQuery" représente la chaîne équivalente codée URL de l'interrogation SPARQL donnée dans le premier bloc de l'exemple ;
  2. Seuls les corps de réponse partiels contenant les résultats d'interrogation sont affichés ;
  3. Les valeurs URI de default-graph-uri et de named-graph-uri ne sont pas codées URL.
2.2.1.1 SELECT avec ensemble de données RDF fourni par le service

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> 
2.2.1.2 SELECT avec ensemble de données RDF simple

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>
2.2.1.3 CONSTRUCT avec un ensemble de données RDF simple et une négociation de contenu HTTP

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.

2.2.1.4 ASK avec un ensemble de données RDF simple

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>
2.2.1.5 DESCRIBE avec un ensemble de données RDF simple

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>
2.2.1.6 SELECT avec un ensemble de données RDF complexe

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>
2.2.1.7 SELECT avec un ensemble de données RDF dans l'interrogation uniquement

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>
2.2.1.8 SELECT avec ensemble de données RDF ambigu

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>
2.2.1.9 SELECT avec incident pour interrogation malformée

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 '}'
2.2.1.10 SELECT avec incident pour requête d'interrogation refusée

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>
2.2.1.11 Très longue interrogation SELECT utilisant une liaison POST

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>
2.2.1.12 SELECT avec internationalisation

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>
2.2.1.13 SELECT avec liaison queryHttpPost et entrée XML

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>

2.3 Liaisons SOAP

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.

2.3.1 Exemple SOAP

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>

3. Observations règlementaires

3.1 Sécurité

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.

4. Conformité

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 :

  1. DOIT mettre en œuvre l'interface SparqlQuery ;
  2. PEUT mettre en œuvre les liaisons HTTP, ou SOAP, ou les deux, de l'opération query de l'interface SparqlQuery ;
  3. DOIT mettre en œuvre les liaisons HTTP ou SOAP de l'opération query de la façon décrite dans ce document (« Protocole SPARQL pour RDF ), dans les fichiers protocol-query.wsdl et protocol-types.xsd ;
  4. PEUT mettre en œuvre d'autres interfaces, les liaisons des opérations de celles-ci, ou d'autres liaisons de l'opération query que les liaisons HTTP ou SOAP normatives décrites par le « Protocole SPARQL pour RDF » ;
  5. DOIT être cohérent avec les contraintes normatives (indiquées par les mots-clés [RFC 2119]) décrites à la section 3. Observations règlementaires.

5. Références

1. Références normatives

[RFC2119]
Mots-clés à utiliser dans les RFC pour indiquer les niveaux d'exigence, RFC 2119, S. Bradner, mars 1997
[RFC3987]
Identificateurs de ressource internationalisés (IRI), RFC 3987, M. Dürst, M. Suignard
[RFC3986]
Identificateur de ressource uniforme (URI — Syntaxe générique, RFC 3986, T. Berners-Lee, R. Fielding, L. Masinter, janvier 2005
[HTTP]
Protocole de transfert hypertexte — HTTP/1.1, RFC 2616, R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, T. Berners-Lee, juin 1999
[RDF-Concepts]
Cadre de description de ressource (RDF) — Concepts et syntaxe abstraite, G. Klyne, J. Carroll, rédacteurs, recommandation du W3C, 10 février 2004, http://www.w3.org/TR/2004/REC-rdf-primer-20040210/. Dernière version disponible à http://www.w3.org/TR/rdf-concepts/.
[RDF-Syntax]
Spécification de la syntaxe RDF/XML (révisée), D. Beckett, rédacteur, recommandation du W3C, 10 février 2004, http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/. Dernière version disponible à http://www.w3.org/TR/rdf-syntax-grammar.
[SOAP12]
SOAP version 1.2 tome 2 — Compléments, M. Gudgin, M. Hadley, N. Mendelsohn, J.-J. Moreau, H.F. Nielsen, rédacteurs, recommandation du W3C, 27 avril 2007, http://www.w3.org/TR/2007/REC-soap12-part2-20070427/. Dernière version disponible à http://www.w3.org/TR/soap12-part2/.
[SPARQL]
Langage d'interrogation SPARQL pour RDF, A. Seaborne, E. Prud'hommeaux, rédacteurs, recommandation du W3C, 15 janvier 2008, http://www.w3.org/TR/2008/REC-rdf-sparql-query-20080115/. Dernière version disponible à http://www.w3.org/TR/rdf-sparql-query/.
[SRD]
Format XML des résultats d'interrogation SPARQL, D. Beckett, J. Broekstra, rédacteurs, recommandation du W3C, 15 janvier 2008, http://www.w3.org/TR/2008/REC-rdf-sparql-XMLres-20080115/. Dernière version disponible à http://www.w3.org/TR/rdf-sparql-XMLres/.
WSDL2
Langage de description de services web (WSDL) version 2.0 tome 1 — Cœur du langage, R. Chinnici, J. Moreau, A. Ryman, S. Weerawarana, rédacteurs, recommandation du W3C, 26 juin 2007, http://www.w3.org/TR/2007/REC-wsdl20-20070626/. Dernière version disponible à http://www.w3.org/TR/wsdl20.
WSDL2-Adjuncts
Langage de description de services web (WSDL) version 2.0 tome 2 — Compléments, R. Chinnici, H. Haas, A. A. Lewis, J. Moreau, D. Orchard, S. Weerawarana, rédacteurs, recommandation du W3C, 26 juin 2007, http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/. Dernière version disponible à http://www.w3.org/TR/wsdl20-adjuncts.

2. Références informatives

[UC&R]
Cas d'utilisation et exigences de l'accès aux données RDF, K. Clark, rédacteur, version préliminaire du W3C, 25 mars 2005, http://www.w3.org/TR/2005/WD-rdf-dawg-uc-20050325/. Dernière version disponible à http://www.w3.org/TR/rdf-dawg-uc/.
[WSDL2-Primer]
Langage de description de services web (WSDL) version 2.0 tome 0 — Introduction, K. Liu, D. Booth, rédacteurs, recommandation du W3C, 26 juin 2007, http://www.w3.org/TR/2007/REC-wsdl20-primer-20070626/. Dernière version disponible à http://www.w3.org/TR/wsdl20-primer/.
[UNISEC]
Unicode Security Considerations, Mark Davis, Michel Suignard

6. Remerciements

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.


Journal des changements

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.