« SPARQL Protocol and RDF Query Language/Requêtes d'écriture » : différence entre les versions

Une page de Wikiversité, la communauté pédagogique libre.
Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Ligne 10 : Ligne 10 :
}}
}}


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 qui désiraient faire des services Linked Open Data, ont trouvé enfin le moyen d'en faire sans écrire du RDF/XML ou définir une ontologie.
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 qui désiraient faire des services Linked Open Data, ont trouvé enfin le moyen d'alimenter une base de données RDF en temps réel sans RDF/XML ou même 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 roadmap 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, une couche d'intégrité va apparaître pour vous aider à respecter ce critère d'interopérabilité. En attendant dans ce cours, nous vous donnons les moyens de faire les choses comme vous le souhaitez avec vos propres prédicats mais si vous ne voulez pas tout refaire dans 2 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).
Cependant, il faut garder à l'esprit que '''l’interopérabilité est l'objectif final de SPARQL pour faire avancer la roadmap 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 faire les choses comme vous le souhaitez avec vos propres prédicats mais si vous ne voulez pas tout refaire dans 2 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 de cette leçon) et qui sont aussi définies dans la recommandation SPARQL 1.1 (la personne qui coordonne la recommandation de SPARQL 1.1 et aussi le principal développeur de 4Store).
Nous allons décrire ici les requêtes qui fonctionnent dans le logiciel 4Store (utilisé dans les TPs) et qui sont aussi définies dans la recommandation SPARQL 1.1 (la personne qui coordonne la recommandation de SPARQL 1.1 et 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 (etc.) 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 nommés 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 (etc.) est un conteneur de graphes nommés RDF géré par un seul service. Un silo contient un graphe (sans nom) par défaut et zéro ou plusieurs emplacements nommés tenant pour contenir des [[w:Graphe nommé|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.


{{Remarque|contenu=
{{Remarque|contenu=
Ligne 30 : Ligne 30 :
}}
}}


Les fonctions qui fonctionnent pour le moment sont les principales :
Les fonctions qui fonctionnent 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 voir d'autres fonctions et apprendre à les utiliser à travers leurs API PHP disponibles.
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 voir 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 en 3 parties:
Une requête d'insertion est composé de 3 parties:
*les préfixes
*les préfixes
*l'adresse du graphe de destination
*l'adresse du graphe de destination
Ligne 75 : Ligne 75 :
} }</pre>
} }</pre>


Voici le graphe http://example/bookStore avant :
Voici le graphe http://example/bookStore avant d'appliquer la précédente requête
<pre># Graph: http://example/bookStore
<pre># Graph: http://example/bookStore
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
Ligne 81 : Ligne 81 :
<http://example/book2> dc:title "SPARQL is cooler than SQL" .</pre>
<http://example/book2> dc:title "SPARQL is cooler than SQL" .</pre>


Dans ce graphe après l'insertion :
Voilà le graphe après l'insertion
<pre># Graph: http://example/bookStore
<pre># Graph: http://example/bookStore
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
Ligne 120 : Ligne 120 :
=== Exemples ===
=== Exemples ===
==== Simple suppression de triplets ====
==== Simple suppression de triplets ====
Ici nous allons supprimons deux triples. Le graphe qui contient les prix des livres est toujours : http://example/bookStore
Ici nous allons supprimer deux triples. 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 132 : Ligne 132 :
}}</pre>
}}</pre>


Voici le graphe http://example/bookStore avant :
Voici le graphe http://example/bookStore avant la suppression
<pre># Graph: http://example/bookStore
<pre># Graph: http://example/bookStore
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
Ligne 141 : Ligne 141 :
<http://example/book2> dc:creator "Edmund Wells" .</pre>
<http://example/book2> dc:creator "Edmund Wells" .</pre>


Voici ce graphe après :
Voici ce graphe après la suppression
<pre># Graph: http://example/bookStore
<pre># Graph: http://example/bookStore
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
Ligne 149 : Ligne 149 :


==== Suppression de triplets en fonction d'un masque ====
==== Suppression de triplets en fonction d'un masque ====
Ici nous allons retirer un livre de notre base de donnée. Le graphe qui contient les des livres est toujours : http://example/bookStore
Ici comme exemple, nous allons retirer un livre de notre base de donnée. Le graphe qui contient des livres est toujours : http://example/bookStore
Nous savons que l'IRI du livre est <nowiki>http://example/book2</nowiki>.
Nous savons que la référence du livre à retirer est <nowiki>http://example/book2</nowiki>.


Nous allons utilisé des variables pour représenter tous les triplets que nous désirons supprimer.
Nous allons utiliser des variables pour représenter tous les triplets que nous désirons supprimer.


On appliquera ainsi la requête SPARQL :
On appliquera ainsi la requête SPARQL :
Ligne 163 : Ligne 163 :
}}</pre>
}}</pre>


Voici le graphe http://example/bookStore avant :
Voici le graphe http://example/bookStore avant la suppression :
<pre># Graph: http://example/bookStore
<pre># Graph: http://example/bookStore
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
Ligne 177 : Ligne 177 :
<http://example/book3> dc:title "SPARQL 1.1 Tutorial" .</pre>
<http://example/book3> dc:title "SPARQL 1.1 Tutorial" .</pre>


Voici ce graphe après :
Voici ce graphe après la suppression :
<pre># Graph: http://example/bookStore
<pre># Graph: http://example/bookStore
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
Ligne 195 : Ligne 195 :
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 les des livres est toujours : http://example/bookStore
Le graphe qui contient les des livres est toujours : http://example/bookStore
Nous savons que l'IRI du livre est <nowiki>http://example/book2</nowiki> et les données du formulaire.
Nous n'avons que la référence du livre est <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 24 novembre 2011 à 13:37

Logo de la faculté
Cette page est une ébauche concernant l’informatique. Avant de recréer une ressource du même type, essayez d'abord de compléter celle-ci ; si c'est impossible, remplacez son contenu par le vôtre. Si vous êtes l'auteur(e) de cette page et que vous souhaitez la continuer, retirez ce bandeau.
Début de la boite de navigation du chapitre
Requêtes d'écriture
Icône de la faculté
Chapitre no 6
Leçon : SPARQL Protocol and RDF Query Language
Chap. préc. :Requêtes de lecture
Chap. suiv. :Requêtes de découverte
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « SPARQL : Requêtes d'écriture
SPARQL Protocol and RDF Query Language/Requêtes d'écriture
 », n'a pu être restituée correctement ci-dessus.

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 qui désiraient faire des services Linked Open Data, ont trouvé enfin le moyen d'alimenter une base de données RDF en temps réel sans RDF/XML ou même 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 roadmap 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 faire les choses comme vous le souhaitez avec vos propres prédicats mais si vous ne voulez pas tout refaire dans 2 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 TPs) et qui sont aussi définies dans la recommandation SPARQL 1.1 (la personne qui coordonne la recommandation de SPARQL 1.1 et aussi le principal développeur de 4Store).

Un silo de données

Un silo de données ou base de données RDF (etc.) est un conteneur de graphes nommés RDF géré par un seul service. Un silo contient un graphe (sans nom) par défaut et zéro ou plusieurs emplacements nommés 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.


Vous pouvez ajouter ou supprimer un graphe.


Les fonctions qui fonctionnent pour le moment sont :

  • L'insertion 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 voir d'autres fonctions et apprendre à les utiliser à travers leurs API disponibles en PHP.

INSERT DATA

Syntaxe

Une requête d'insertion est composé 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 en 3 parties:

  • les préfixes
  • l'adresse du graphe où se trouve 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 triples. 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ée. 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 les des livres est toujours : http://example/bookStore Nous n'avons que la référence du livre est 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" .