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érateurSyntaxeDescription
/pred1 / pred2Succession des prédicats
|pred1 | pred2Alternative 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 { pattern }.

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.