SPARQL

Un article de Wikipédia, l'encyclopédie libre.

SPARQL (protocole SPARQL et langage de requête RDF) en informatique est un langage de requête, devenu le 15 Janvier 2008, dans le cadre de l'activité Web sémantique du W3C, une recommandation W3C.

Le langage SPARQL définit la syntaxe et la sémantique nécessaire à l'expression de requêtes sur une base de données de type RDF et la forme possible des résultats.

[modifier] Caractéristiques

SPARQL est adapté à la structure spécifique des graphes RDF, et s'appuie sur les triplets qui les constituent. En cela, il est différent du classique SQL (langage de requête qui est adapté aux bases de données de type relationnelles), mais s'en inspire clairement dans sa syntaxe et ses fonctionnalités. Il a aussi quelques traits de ressemblance mineurs avec Prolog.

SPARQL permet d'exprimer des requêtes interrogatives ou constructives :

  • Une requête SELECT, de type interrogative, permet d'extraire du graphe RDF un sous-graphe correspondant à un ensemble de ressources vérifiant les conditions définies dans une clause WHERE.
  • Une requête CONSTRUCT, de type constructive, engendre un nouveau graphe qui complète le graphe interrogé.

Par exemple sur un graphe RDF contenant des informations généalogiques, on pourra par une requête SELECT trouver les parents ou grands-parents d'une personne donnée, et par des requêtes CONSTRUCT ajouter des relations frère-sœur, cousin-cousine, oncle-neveu, qui ne seraient pas explicitement déclarées dans le graphe initial.

[modifier] Exemple

Exemple de requête SPARQL retournant une liste de photos avec le nom de la personne qu'elles représentent et une description, à partir d'une base de données de type RDF utilisant l'ontologie (vocabulaire) FOAF (une des plus connues et utilisée pour décrire les personnes et les liens entre elles).

  • Extrait du graphe RDF (écriture XML) d'exemple :
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:foaf="http://xmlns.com/foaf/0.1/"
  xmlns:rss="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
        <foaf:Person rdf:about="http://example.net/Paul_Dupont">
                <foaf:name>Paul Dupont</foaf:name>
                <foaf:img rdf:resource="http://example.net/Paul_Dupont.jpg"/>
                <foaf:knows rdf:resource="http://example.net/Pierre_Dumoulin"/>
        </foaf:Person>
        <foaf:Person rdf:about="http://example.net/Pierre_Dumoulin">
                <foaf:name>Pierre Dumoulin</foaf:name>
                <foaf:img rdf:resource="http://example.net/Pierre_Dumoulin.jpg"/>
        </foaf:Person>
        <foaf:Image rdf:about="http://example.net/Paul_Dupont.jpg">
                <dc:description>Photo d'identité de Paul Dupont</dc:description>
        </foaf:Image>
        <foaf:Image rdf:about="http://example.net/Pierre_Dumoulin.jpg">
                <dc:description>Photo d'identité de Pierre Dumoulin</dc:description>
        </foaf:Image>
</rdf:RDF>


  • La requête SPARQL :
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT DISTINCT ?nom ?image ?description
WHERE {
        ?personne rdf:type foaf:Person .
        ?personne foaf:name ?nom .
        ?image rdf:type foaf:Image .
        ?personne foaf:img ?image .
        ?image dc:description ?description
}

On remarque la déclaration des espaces de noms en début, suivis de la requête proprement dite. Le nom des variables est précédé d'un point d'interrogation ?.

La ligne SELECT permet de sélectionner l'ensemble des tuples, ou lignes de variables (nom, image, description) correspondant aux contraintes de la clause WHERE.

La première ligne de la clause WHERE se lit : la variable personne est de type Person au sens de l'ontologie FoaF. La seconde ligne permet de définir la variable nom en tant que propriété name de la variable personne.


  • Le résultat SPARQL :
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
        <head>
                <variable name="nom"/>
                <variable name="image"/>
                <variable name="description"/>
        </head>
        <results ordered="false" distinct="true">
                <result>
                        <binding name="nom">
                                <literal>Pierre Dumoulin</literal>
                        </binding>
                        <binding name="image">
                                <uri>http://example.net/Pierre_Dumoulin.jpg</uri>
                        </binding>
                        <binding name="description">
                                <literal>Photo d'identité de Pierre Dumoulin</literal>
                        </binding>
                </result>
                <result>
                        <binding name="nom">
                                <literal>Paul Dupont</literal>
                        </binding>
                        <binding name="image">
                                <uri>http://example.net/Paul_Dupont.jpg</uri>
                        </binding>
                        <binding name="description">
                                <literal>Photo d'identité de Paul Dupont</literal>
                        </binding>
                </result>
        </results>
</sparql>

[modifier] Références