« SPARQL Protocol and RDF Query Language/Requêtes d'écriture » : différence entre les versions
m Relecture |
|||
Ligne 1 : | Ligne 1 : | ||
{{ébauche informatique}} |
|||
{{Chapitre |
{{Chapitre |
||
| idfaculté = informatique |
| idfaculté = informatique |
||
Ligne 5 : | Ligne 4 : | ||
| titre_leçon = SPARQL |
| titre_leçon = SPARQL |
||
| numéro = 6 |
| numéro = 6 |
||
| niveau = |
| niveau = 0 |
||
| précédent = [[../Requêtes de lecture/]] |
| précédent = [[../Requêtes de lecture/]] |
||
| suivant = [[../Requêtes de découverte/]] |
| suivant = [[../Requêtes de découverte/]] |
||
}} |
}} |
||
Dans la première recommandation de SPARQL |
Dans la première recommandation de SPARQL 1.0 en 2008, il n'était pas encore question de faire des requêtes en écriture. Cependant, dès 2008, des implémentations commencent à apparaître pour écrire des triplets à travers une requête comme une requête SQL et, dès lors, les développeurs trouvent enfin le moyen d'alimenter une base de données RDF en temps réel sans RDF/XML, voire sans définir une ontologie complexe. |
||
Cependant, il faut garder à l'esprit que |
Cependant, il faut garder à l'esprit que l’interopérabilité est l'objectif final de SPARQL pour faire avancer la feuille de route du Web Sémantique. Ainsi, l'utilisation de prédicats fantaisistes, c'est-à-dire d'ontologies fantaisistes, n'est pas conseillée à terme. Dans les prochains mois ou années, un système d'implication va apparaître pour vous aider à respecter ce critère d'interopérabilité. En attendant, dans ce chapitre, nous vous donnons les moyens de travailler comme vous le souhaitez avec vos propres prédicats, mais, si vous ne voulez pas tout refaire dans deux ans, gardez à l'esprit qu'un bon prédicat est un prédicat qui existe déjà dans une ontologie documentée (et, si possible, simple). |
||
Nous allons décrire ici les requêtes qui fonctionnent dans le logiciel 4Store (utilisé dans les |
Nous allons décrire ici les requêtes qui fonctionnent dans le logiciel 4Store (utilisé dans les TP) et qui sont aussi définies dans la recommandation SPARQL 1.1 (la personne qui coordonne la recommandation de SPARQL 1.1 est aussi le principal développeur de 4Store). |
||
== Un silo de données == |
== Un silo de données == |
||
⚫ | Un silo de données, ou base de données RDF, est un conteneur de graphes RDF géré par un seul service. Un silo contient un graphe (sans nom) par défaut et zéro ou plusieurs emplacements (« tenant ») pour contenir des graphes nommés. Un silo a un service SPARQL (« endpoint SPARQL » en anglais) qui traite les requêtes. Grâce à SPARQL 1.1, on peut maintenant spécifier dans une requête le graphe auquel doit s'appliquer cette requête. Si une requête ne contient pas de graphe identifié, la requête s'applique au graphe par défaut. |
||
⚫ | Un silo de données ou base de données RDF |
||
{{Remarque|contenu= |
{{Remarque|contenu= |
||
Un graphe par défaut est implémenté de manière différente dans chaque logiciel. Il existe encore des subtilités. Il vaut mieux toujours travailler dans des graphes nommés, cela vous évitera de très |
Un graphe par défaut est implémenté de manière différente dans chaque logiciel. Il existe encore des subtilités. Il vaut mieux toujours travailler dans des graphes nommés, cela vous évitera de très mauvaises surprises. |
||
}} |
}} |
||
Ligne 27 : | Ligne 25 : | ||
{{Remarque|contenu= |
{{Remarque|contenu= |
||
SPARQL 1.1 n'est pas encore intégralement implémenté. Les développeurs commencent par les fonctions les plus simples et n'ont souvent pas encore développé les requêtes d'administration de graphes. Ainsi pour supprimer un graphe, il suffit |
SPARQL 1.1 n'est pas encore intégralement implémenté. Les développeurs commencent par les fonctions les plus simples et n'ont souvent pas encore développé les requêtes d'administration de graphes. Ainsi, pour supprimer un graphe, il suffit de supprimer tous les triplets d'un graphe ; il suffit d'insérer au moins un triplet dans un graphe pour créer ce nouveau graphe. |
||
}} |
}} |
||
Les fonctions |
Les fonctions utilisables pour le moment sont : |
||
* L'insertion de triplets |
* L'insertion de triplets |
||
* La suppression de triplets |
* La suppression de triplets |
||
Il existe d'autres fonctions mais différentes d'un logiciel à un autre. Nous étudierons ici que les requêtes "INSERT DATA" et "DELETE DATA". Dans les TP, vous pourrez |
Il existe d'autres fonctions, mais elles sont différentes d'un logiciel à un autre. Nous étudierons ici que les requêtes "INSERT DATA" et "DELETE DATA". Dans les TP, vous pourrez découvrir d'autres fonctions et apprendre à les utiliser à travers leurs API disponibles en PHP. |
||
== INSERT DATA == |
== INSERT DATA == |
||
=== Syntaxe === |
=== Syntaxe === |
||
Une requête d'insertion est |
Une requête d'insertion est composée de 3 parties: |
||
*les préfixes |
*les préfixes |
||
*l'adresse du graphe de destination |
*l'adresse du graphe de destination |
||
Ligne 95 : | Ligne 93 : | ||
=== Syntaxe === |
=== Syntaxe === |
||
Une requête de suppression est |
Une requête de suppression est composée de 3 parties : |
||
*les préfixes |
*les préfixes |
||
*l'adresse du graphe où se |
*l'adresse du graphe où se trouvent les triplets à supprimer |
||
*les triplets à supprimer ou le masque des triplets à supprimer |
*les triplets à supprimer ou le masque des triplets à supprimer |
||
<pre> |
<pre> |
||
Ligne 120 : | Ligne 118 : | ||
=== Exemples === |
=== Exemples === |
||
==== Simple suppression de triplets ==== |
==== Simple suppression de triplets ==== |
||
Ici nous allons supprimer deux |
Ici, nous allons supprimer deux triplets. Le graphe qui contient les prix des livres est toujours : http://example/bookStore |
||
On appliquera ainsi la requête SPARQL : |
On appliquera ainsi la requête SPARQL : |
||
Ligne 149 : | Ligne 147 : | ||
==== Suppression de triplets en fonction d'un masque ==== |
==== Suppression de triplets en fonction d'un masque ==== |
||
Ici comme exemple, nous allons retirer un livre de notre base de |
Ici, comme exemple, nous allons retirer un livre de notre base de données. Le graphe qui contient des livres est toujours : http://example/bookStore |
||
Nous savons que la référence du livre à retirer est <nowiki>http://example/book2</nowiki>. |
Nous savons que la référence du livre à retirer est <nowiki>http://example/book2</nowiki>. |
||
Ligne 188 : | Ligne 186 : | ||
<!--=== Exercice ===--> |
<!--=== Exercice ===--> |
||
== Et la mise |
== Et la mise à jour des données : UPDATE ? == |
||
La mise à jour d'une donnée est en réalité pour le moment une requête DELETE suivie d'une requête INSERT. |
La mise à jour d'une donnée est en réalité pour le moment une requête DELETE suivie d'une requête INSERT. |
||
Ligne 195 : | Ligne 193 : | ||
Nous allons mettre à jour un livre de notre base de données. C'est un simple formulaire Web qui va mettre à jour sa fiche. |
Nous allons mettre à jour un livre de notre base de données. C'est un simple formulaire Web qui va mettre à jour sa fiche. |
||
Le graphe qui contient |
Le graphe qui contient des livres est toujours : http://example/bookStore |
||
Nous n'avons que la référence du livre |
Nous n'avons que la référence du livre <nowiki>http://example/book2</nowiki> et les données du formulaire. |
||
On appliquera ainsi la requête SPARQL : |
On appliquera ainsi la requête SPARQL : |
Version du 27 décembre 2011 à 15:47
Dans la première recommandation de SPARQL 1.0 en 2008, il n'était pas encore question de faire des requêtes en écriture. Cependant, dès 2008, des implémentations commencent à apparaître pour écrire des triplets à travers une requête comme une requête SQL et, dès lors, les développeurs trouvent enfin le moyen d'alimenter une base de données RDF en temps réel sans RDF/XML, voire sans définir une ontologie complexe.
Cependant, il faut garder à l'esprit que l’interopérabilité est l'objectif final de SPARQL pour faire avancer la feuille de route du Web Sémantique. Ainsi, l'utilisation de prédicats fantaisistes, c'est-à-dire d'ontologies fantaisistes, n'est pas conseillée à terme. Dans les prochains mois ou années, un système d'implication va apparaître pour vous aider à respecter ce critère d'interopérabilité. En attendant, dans ce chapitre, nous vous donnons les moyens de travailler comme vous le souhaitez avec vos propres prédicats, mais, si vous ne voulez pas tout refaire dans deux ans, gardez à l'esprit qu'un bon prédicat est un prédicat qui existe déjà dans une ontologie documentée (et, si possible, simple).
Nous allons décrire ici les requêtes qui fonctionnent dans le logiciel 4Store (utilisé dans les TP) et qui sont aussi définies dans la recommandation SPARQL 1.1 (la personne qui coordonne la recommandation de SPARQL 1.1 est aussi le principal développeur de 4Store).
Un silo de données
Un silo de données, ou base de données RDF, est un conteneur de graphes RDF géré par un seul service. Un silo contient un graphe (sans nom) par défaut et zéro ou plusieurs emplacements (« tenant ») pour contenir des graphes nommés. Un silo a un service SPARQL (« endpoint SPARQL » en anglais) qui traite les requêtes. Grâce à SPARQL 1.1, on peut maintenant spécifier dans une requête le graphe auquel doit s'appliquer cette requête. Si une requête ne contient pas de graphe identifié, la requête s'applique au graphe par défaut.
Un graphe par défaut est implémenté de manière différente dans chaque logiciel. Il existe encore des subtilités. Il vaut mieux toujours travailler dans des graphes nommés, cela vous évitera de très mauvaises surprises.
Vous pouvez ajouter ou supprimer un graphe.
SPARQL 1.1 n'est pas encore intégralement implémenté. Les développeurs commencent par les fonctions les plus simples et n'ont souvent pas encore développé les requêtes d'administration de graphes. Ainsi, pour supprimer un graphe, il suffit de supprimer tous les triplets d'un graphe ; il suffit d'insérer au moins un triplet dans un graphe pour créer ce nouveau graphe.
Les fonctions utilisables pour le moment sont :
- L'insertion de triplets
- La suppression de triplets
Il existe d'autres fonctions, mais elles sont différentes d'un logiciel à un autre. Nous étudierons ici que les requêtes "INSERT DATA" et "DELETE DATA". Dans les TP, vous pourrez découvrir d'autres fonctions et apprendre à les utiliser à travers leurs API disponibles en PHP.
INSERT DATA
Syntaxe
Une requête d'insertion est composée de 3 parties:
- les préfixes
- l'adresse du graphe de destination
- les triplets à enregistrer
#Les préfixes PREFIX dc: <...> ... #Clause INSERT DATA INSERT DATA { #IRI du graphe qui contiendra les triplets GRAPH <...> { #les triplets ... } }
Exemple
Ici nous allons ajouter deux triplets qui donnent les prix de deux livres. Le graphe qui contient les prix des livres est : http://example/bookStore
On appliquera ainsi la requête SPARQL :
PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX ns: <http://example.org/ns#> INSERT DATA { GRAPH <http://example/bookStore> { <http://example/book1> ns:price 42 . <http://example/book2> ns:price 23 . } }
Voici le graphe http://example/bookStore avant d'appliquer la précédente requête
# Graph: http://example/bookStore @prefix dc: <http://purl.org/dc/elements/1.1/> . <http://example/book1> dc:title "Fundamentals of Compiler Design" . <http://example/book2> dc:title "SPARQL is cooler than SQL" .
Voilà le graphe après l'insertion
# Graph: http://example/bookStore @prefix dc: <http://purl.org/dc/elements/1.1/> . @prefix ns: <http://example.org/ns#> . <http://example/book1> dc:title "Fundamentals of Compiler Design" . <http://example/book1> ns:price 42 . <http://example/book2> dc:title "SPARQL is cooler than SQL" . <http://example/book2> ns:price 23 .
DELETE DATA
Syntaxe
Une requête de suppression est composée de 3 parties :
- les préfixes
- l'adresse du graphe où se trouvent les triplets à supprimer
- les triplets à supprimer ou le masque des triplets à supprimer
#Les préfixes PREFIX dc: <...> ... #Clause INSERT DATA DELETE DATA { #IRI du graphe qui contient les triplets GRAPH <...> { #les triplets ou le masque de triplet ... } }
Exemples
Simple suppression de triplets
Ici, nous allons supprimer deux triplets. Le graphe qui contient les prix des livres est toujours : http://example/bookStore
On appliquera ainsi la requête SPARQL :
PREFIX dc: <http://purl.org/dc/elements/1.1/> DELETE DATA { GRAPH <http://example/bookStore> { <http://example/book2> dc:title "David Copperfield" ; dc:creator "Edmund Wells" . }}
Voici le graphe http://example/bookStore avant la suppression
# Graph: http://example/bookStore @prefix dc: <http://purl.org/dc/elements/1.1/> . @prefix ns: <http://example.org/ns#> . <http://example/book2> ns:price 42 . <http://example/book2> dc:title "David Copperfield" . <http://example/book2> dc:creator "Edmund Wells" .
Voici ce graphe après la suppression
# Graph: http://example/bookStore @prefix dc: <http://purl.org/dc/elements/1.1/> . @prefix ns: <http://example.org/ns#> . <http://example/book2> ns:price 42 .
Suppression de triplets en fonction d'un masque
Ici, comme exemple, nous allons retirer un livre de notre base de données. Le graphe qui contient des livres est toujours : http://example/bookStore Nous savons que la référence du livre à retirer est http://example/book2.
Nous allons utiliser des variables pour représenter tous les triplets que nous désirons supprimer.
On appliquera ainsi la requête SPARQL :
PREFIX dc: <http://purl.org/dc/elements/1.1/> DELETE DATA { GRAPH <http://example/bookStore> { <http://example/book2> ?predicat ?objet. }}
Voici le graphe http://example/bookStore avant la suppression :
# Graph: http://example/bookStore @prefix dc: <http://purl.org/dc/elements/1.1/> . <http://example/book1> dc:title "Principles of Compiler Design" . <http://example/book1> dc:date "1977-01-01T00:00:00-02:00"^^xsd:dateTime . <http://example/book2> ns:price 42 . <http://example/book2> dc:title "David Copperfield" . <http://example/book2> dc:creator "Edmund Wells" . <http://example/book2> dc:date "1948-01-01T00:00:00-02:00"^^xsd:dateTime . <http://example/book3> dc:title "SPARQL 1.1 Tutorial" .
Voici ce graphe après la suppression :
# Graph: http://example/bookStore @prefix dc: <http://purl.org/dc/elements/1.1/> . <http://example/book1> dc:title "Principles of Compiler Design" . <http://example/book1> dc:date "1977-01-01T00:00:00-02:00"^^xsd:dateTime . <http://example/book3> dc:title "SPARQL 1.1 Tutorial" .
Et la mise à jour des données : UPDATE ?
La mise à jour d'une donnée est en réalité pour le moment une requête DELETE suivie d'une requête INSERT.
Exemple
Nous allons mettre à jour un livre de notre base de données. C'est un simple formulaire Web qui va mettre à jour sa fiche.
Le graphe qui contient des livres est toujours : http://example/bookStore
Nous n'avons que la référence du livre http://example/book2 et les données du formulaire.
On appliquera ainsi la requête SPARQL :
PREFIX dc: <http://purl.org/dc/elements/1.1/> DELETE DATA { GRAPH <http://example/bookStore> { <http://example/book2> ?predicat ?objet. }} INSERT DATA { GRAPH <http://example/bookStore> { <http://example/book2> ns:price 44 . <http://example/book2> dc:title "Sir David Copperfield"@en . <http://example/book2> dc:creator "Edmond Wells"@en . <http://example/book2> dc:date "1948-01-02T00:00:00-02:00"^^xsd:dateTime . }}
Voici le graphe http://example/bookStore avant :
# Graph: http://example/bookStore @prefix dc: <http://purl.org/dc/elements/1.1/> . <http://example/book1> dc:title "Principles of Compiler Design"@en . <http://example/book1> dc:date "1977-01-01T00:00:00-02:00"^^xsd:dateTime . <http://example/book2> ns:price 42 . <http://example/book2> dc:title "David Copperfield"@en . <http://example/book2> dc:creator "Edmund Wells"@en . <http://example/book2> dc:date "1948-01-01T00:00:00-02:00"^^xsd:dateTime . <http://example/book3> dc:title "SPARQL 1.1 Tutorial"@en .
Voici ce graphe après :
# Graph: http://example/bookStore @prefix dc: <http://purl.org/dc/elements/1.1/> . <http://example/book1> dc:title "Principles of Compiler Design" . <http://example/book1> dc:date "1977-01-01T00:00:00-02:00"^^xsd:dateTime . <http://example/book2> ns:price 44 . <http://example/book2> dc:title "Sir David Copperfield"@en . <http://example/book2> dc:creator "Edmond Wells"@en . <http://example/book2> dc:date "1948-01-02T00:00:00-02:00"^^xsd:dateTime . <http://example/book3> dc:title "SPARQL 1.1 Tutorial" .