13. De la table au graphe et SPARQL
Les SGBDR
SGBDR (Système de Gestion de Base de Données Relationnelles):
Données structurées dans des tables à 2 dimensions.
Vision objective: Table / Colonne / Ligne / Valeur.
ACID: garantit l’intégrité des données (Atomicité, Cohérence, Isolation, Durabilité).
Relationnel: lien anonyme entre clé étrangère et clé primaire.
Requêtage: SQL.
Exemple de structure:
Table Personne
ID | First name | Company_ID
7d74e4b2a58 | Richard | 32617a68798
Table Organisation
ID | Name | Year
32617a68798 | Bouygues Telecom | 1994
Key-Value
Base de données clé-valeur:
Structure simple: une clé identifie une valeur.
Exemple:
Key: orga-1
Value: Bouygues Telecom | 1994
Key: people-1
Value: { "first-name": "Richard"; "company": "Bouygues Telecom", "company-id": "orga-1" }
Documents
Bases orientées documents:
Données structurées dans des collections de documents.
Vision subjective: supprime les jointures.
Beaucoup d’écritures concurrentes.
Intégrité et cohérence non cruciales.
Exemple JSON:
{
"id": "2776c120-29e6-11ec-9621-0242ac130002",
"firstName": "Richard",
"company": {
"id": "90f5d9b0-29e6-11ec-9621-0242ac130002",
"name": "Bouygues Telecom",
"creationDate": 1994
}
}Triple Store
Base de données orientée graphe pour le web sémantique.
Structure: triplets RDF (Sujet - Prédicat - Objet).
graph LR TS[Triple Store] --> F[Faits/Triplets] TS --> O[Ontologie] TS --> R[Règles d'inférence] R --> RA[Raisonneur]
Composants d’un Triple Store:
Faits: ensemble des triplets RDF stockés
Ontologie: définition des classes, propriétés et relations
Raisonneur: applique les règles d’inférence
Règles d’inférence: déduisent de nouveaux triplets
Environ 50 Triple Stores différents avec performances et mécanismes d’inférence variés (backward, forward, hybrid, rules language).
Bases traditionnelles vs Bases sémantiques
Comparaison:
Schéma:
- Traditionnel: maintenir et modifier le schéma est complexe et très impactant
- Sémantique: maintenir et modifier l’ontologie est simple et peu impactant
Contexte:
- Traditionnel: réponses dépourvues de contexte
- Sémantique: réponses reflètent informations et modèle associé (contexte préservé)
Requêtes:
- Traditionnel: répond uniquement aux requêtes explicites
- Sémantique: répond aux requêtes explicites comme implicites
Performance:
- Traditionnel: requêtage très performant et éprouvé, paradigme ancré depuis décennies
- Sémantique: peut avoir problèmes de performance et scalabilité, recul nécessaire pour industrialisation, paradigme contre-intuitif
Introduction à SPARQL
SPARQL: langage de requête orienté graphe pour interroger les Triple Stores.
Exemple de contexte:
#avatar rdf:type esc:Movie
#james_cameron esc:hasDirected #avatar
#sigourney_weaver esc:hasPlayedIn #avatar
esc:Actor rdfs:subClassOf esc:Person
Questions possibles:
- Who acted in
#avatar? - Who works on
#avatar? - Who are
#james_cameron’s colleagues?
Autres langages orientés graphe: Cypher, SeRQL.
Variables et Patterns
Variable:
Remplace une ressource, un prédicat ou un litéral.
Ne possède pas de namespace.
Préfixée par ”?” : ?x, ?actor, ?date.
Pattern:
Ensemble de triplets contenant des variables.
Décrit un graphe générique basé sur l’ontologie.
Exemples de patterns:
?something rdf:type esc:Movie
esc:Actor ?relation esc:Movie
?actor ?predicate ?date
Exercice - Les joueurs:
?player rdf:type esc:Player
Exercice - Les joueurs avec T-shirt blanc:
?player rdf:type esc:Player .
?player esc:wears ?color .
?color esc:hasValue "white"
Exercice - Les joueurs ayant marqué:
?player rdf:type esc:Player .
?player esc:does ?action .
?action rdf:type esc:Goal
Exercice - Les joueurs de volley:
?player rdf:type esc:Player .
?sequence esc:displays ?player .
?sequence esc:hasCompetition ?competition .
?competition rdf:type esc:Volleyball
Exercice - Séquences montrant un libero de volley:
?sequence esc:displays ?player .
?player esc:playsAtPosition esc:Libero .
?sequence esc:hasCompetition ?competition .
?competition rdf:type esc:Volleyball
Structure générique d’une requête SPARQL
Forme générale:
Prologue
BASE nomBase: <namespace-uri>
PREFIX prefix: <namespace-uri>
Head
ASK | SELECT [DISTINCT] variableList | CONSTRUCT [{ pattern }]
Body
WHERE { pattern }
[GROUP BY]
[HAVING]
[ORDER BY]
[LIMIT integer > 0]
[OFFSET integer > 0][] symbolise clause non-obligatoire.
| symbolise qu’une seule option doit être choisie.
Exemple SELECT:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX esc: <http://www.esc.fr/resource/#>
SELECT ?involved ?predicate
WHERE {
?involved ?predicate esc:Avatar .
}Exemple ASK:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX esc: <http://www.esc.fr/resource/#>
ASK
WHERE {
?actor rdf:type esc:Actor .
}Exemple CONSTRUCT:
PREFIX esc: <http://www.esc.fr/resource/#>
CONSTRUCT { ?dir esc:hasDirected esc:Avatar }
WHERE {
?dir esc:hasDirected esc:Avatar .
}Exercice - Lister tous les joueurs:
SELECT ?player
WHERE {
?player rdf:type esc:Player .
}Exercice - Des joueurs ont-ils un t-shirt blanc?
ASK
WHERE {
?player rdf:type esc:Player .
?player esc:wears ?color .
?color esc:hasValue "white" .
}Exercice - Prédicats sortant de Séquence Vidéo:
SELECT ?predicate
WHERE {
esc:VideoSequence ?predicate ?object .
}Body Function: FILTER
Permet de filtrer les données selon un critère défini.
Syntaxe: FILTER (condition).
Exemple:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX esc: <http://www.esc.fr/resource/#>
SELECT ?name
WHERE {
?actor rdf:type esc:Actor .
?actor esc:hasActedIn esc:Avatar .
?actor rdfs:label ?name .
FILTER(lang(?name) = 'fr') .
}Question: Quels sont les noms français des acteurs d’Avatar?
Résultat:
?name
"Sigourney Weaver"@fr
BIND
Permet d’assigner une valeur à une variable.
Syntaxe: BIND(expression as ?variable).
Exemple:
PREFIX rdf: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX pizza: <http://www.pizza.fr/#>
SELECT ?priceDiscount ?pizza
WHERE {
?pizza rdf:type pizza:Pizza .
?pizza pizza:price ?price .
BIND(?price * 0.20 as ?priceDiscount)
}Question: Quel est le prix d’une pizza avec réduction de 20%?
Expression de chemins
Un chemin est une succession de prédicats.
Opérateurs pour chemins:
| Opérateur | Syntaxe | Description |
|---|---|---|
| / | pred1 / pred2 | Succession des prédicats |
| | | pred1 | pred2 | Alternative entre prédicats |
| * | pred* | Répétition 0 à n fois |
| + | pred+ | Répétition 1 à n fois |
Exemple:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX pizza: <http://www.pizza.fr/#>
SELECT ?topping
WHERE {
?pizza rdf:type pizza:Pizza .
?pizza pizza:topping/rdfs:label ?topping .
}Question: Quels sont les labels des toppings d’une pizza?
Équivalence du chemin:
?pizza pizza:topping/rdfs:label ?topping
⟺
?pizza pizza:topping ?temp .
?temp rdfs:label ?topping .
Requêtes conjointes
Permettent de combiner plusieurs endpoints SPARQL en une seule requête.
Identification avec SERVICE.
Syntaxe: SERVICE
Exemple:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX pizza: <http://www.pizza.fr/#>
CONSTRUCT { ?pizza ?p ?o }
WHERE {
?pizza rdf:type pizza:Pizza .
SERVICE <https://query.wikidata.org/sparql> {
?pizza ?p ?o
}
}Question: Quelles sont les informations de nos pizzas disponibles sur Wikidata?
Mise à jour via SPARQL
INSERT DATA / DELETE DATA:
Permet d’insérer ou supprimer des triplets dans la base.
Syntaxe: INSERT DATA { pattern } ou DELETE DATA { pattern }.
Exemple insertion:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX pizza: <http://www.pizza.fr/#>
INSERT DATA {
pizza:SalmonPizza rdf:type pizza:Pizza .
}INSERT / DELETE avec condition:
Permet d’ajouter ou supprimer des triplets selon certaines conditions.
Syntaxe: INSERT { patternInsert } WHERE { patternWhere }.
Exemple insertion conditionnelle:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX pizza: <http://www.pizza.fr/#>
INSERT { ?pizza rdf:type pizza:SeaPizza }
WHERE {
?pizza ?topping pizza:Fish .
}Différence avec CONSTRUCT:
CONSTRUCT retourne un graphe RDF résultat.
INSERT ajoute les triplets directement dans le Triple Store.