Graph Database

Les bases de données graphes pour des données intensément connectées (Neo4j, ArangoDB)

01

📖 Qu'est-ce qu'une Graph Database ?

Une base de données graphe (Graph Database) est un système de stockage qui utilise des nœuds, des relations et des propriétés pour représenter et stocker des données. Contrairement aux bases relationnelles qui utilisent des tables, les graphes excellent dans la gestion de données fortement interconnectées.

💡 À retenir : Les bases de données graphes rendent les requêtes de relations (amis des amis, chaînes de recommandation) jusqu'à 1000x plus rapides qu'avec SQL.
Performance

Navigation en temps réel

🔄
Flexibilité

Schéma adaptable

🔍
Intuitif

Modèle proche du métier

02

🔍 Le modèle graphe de propriétés

Le modèle Property Graph est le plus répandu (Neo4j, ArangoDB). Il se compose de :

  • Nœuds (Nodes) : Les entités (Personne, Discours, Ville)
  • Relations (Edges) : Les liens entre nœuds (A_ECRIT, CONNAIT, SITUE_DANS)
  • Propriétés (Properties) : Attributs sous forme clé-valeur (nom, âge, date)
  • Labels : Types ou rôles des nœuds
📊 Représentation visuelle :

(Orateur:Victor Hugo)
    │
    ├── [A_ECRIT] → (Discours:Les Misérables)
    ├── [A_POUR_NOM] → "Victor Hugo"
    └── [EST_NE_A] → (Ville:Besançon)
📝 Exemple de nœud :
{ labels: ["Orateur"], properties: { nom: "Charles de Gaulle", dateNaissance: "1890-11-22" } }
03

🗣️ Langage Cypher (Neo4j)

Cypher est le langage de requête déclaratif de Neo4j, conçu pour être intuitif et visuel. Sa syntaxe utilise des motifs ASCII-art pour représenter les chemins du graphe.

Syntaxe de base

MATCH (orateur:Orateur {nom: "Victor Hugo"})
RETURN orateur

Trouver les discours d'un orateur

MATCH (orateur:Orateur {nom: "Victor Hugo"})-[r:A_ECRIT]->(discours:Discours)
RETURN discours.titre, discours.date
ORDER BY discours.date

Parcours à plusieurs niveaux

# Amis des amis
MATCH (moi:Personne {nom: "Jean"})-[:CONNAIT*2]->(connaissance)
RETURN DISTINCT connaissance.nom

Création de données

CREATE (v:Orateur {nom: "Victor Hugo", naissance: 1802})
CREATE (l:Discours {titre: "Les Misérables"})
CREATE (v)-[:A_ECRIT]->(l)
💡 Astuce : Cypher utilise la notation (nœud)-[RELATION]->(nœud). Les parenthèses pour les nœuds, les crochets pour les relations.
04

🏢 Solutions du marché

SolutionTypeLangageParticularité
Neo4j Propriétaire / Community Edition Cypher Leader du marché, très mature
ArangoDB Open Source AQL Multi-modèle (graphe + document + recherche)
Amazon Neptune Cloud managé Gremlin / SPARQL Support RDF et Property Graph
TigerGraph Propriétaire GSQL Performances massives
🎯 Notre recommandation : Pour débuter, Neo4j Community Edition est gratuit, bien documenté et dispose d'une excellente communauté.
05

🎯 Cas d'usage des bases de données graphes

1. Réseaux sociaux

Recommandations d'amis, parcours de relations, influenceurs.

MATCH (moi:User {id: 123})-[:FRIEND*2]->(suggestion)
WHERE NOT (moi)-[:FRIEND]->(suggestion)
RETURN suggestion.nom

2. Détection de fraude

Identifier des schémas suspects dans des transactions financières.

MATCH (c1:Compte)-[:TRANSFERT*3..5]->(c2:Compte)
WHERE c1.pays <> c2.pays
RETURN c1, c2

3. Moteurs de recommandation

"Les clients qui ont acheté ce produit ont aussi acheté..."

MATCH (p:Produit {id: 123})<-[:ACHETE]-(client)-[:ACHETE]->(reco)
RETURN reco.nom, COUNT(*) ORDER BY COUNT(*) DESC

4. Gestion des dépendances

Analyse d'impact, chemins critiques, architecture logicielle.

5. Knowledge Graph

Graphes de connaissances d'entreprise (moins standardisé que RDF mais plus simple).

06

⚖️ Graphe de propriétés vs Triple Store RDF

等方法Modérée 🏆
CritèreProperty Graph (Neo4j)Triple Store RDF
Modèle Nœuds + relations + propriétés Triplets (Sujet-Prédicat-Objet)
Standard Propriétaire (Cypher, Gremlin) W3C (RDF, SPARQL, OWL) 🏆
Inférence Non native (code externe) Native (via ontologies OWL) 🏆
Performance Optimisée pour graphes profonds 🏆 Optimisée pour requêtes complexes
Courbe apprentissage Élevée
Interopérabilité Limitée (verrouillage fournisseur) Excellente (standards ouverts) 🏆
💡 Le choix dépend :
  • Besoin d'interopérabilité et de standards → RDF / Triple Store
  • Besoin de performance brute et simplicité → Property Graph
  • Les deux sont possibles ! Neo4j peut importer/exporter du RDF via plugin neosemantics
07

🎯 Exemple complet : graphe de discours avec Neo4j

Schéma du graphe

(Orateur:DeGaulle) ─[A_PRONONCE]→ (Discours:Appel18Juin)
(Discours:Appel18Juin) ─[CONCERNE]→ (Theme:Resistance)
(Orateur:DeGaulle) ─[EST_A_POUR_NOM]→ "Charles de Gaulle"

Création

CREATE (dg:Orateur {nom: "Charles de Gaulle", naissance: 1890})
CREATE (appel:Discours {titre: "Appel du 18 juin", date: "1940-06-18"})
CREATE (resistance:Theme {nom: "Résistance"})
CREATE (dg)-[:A_PRONONCE]->(appel)
CREATE (appel)-[:CONCERNE]->(resistance)

Requêtes

# Tous les discours sur la Résistance
MATCH (theme:Theme {nom: "Résistance"})<-[:CONCERNE]-(discours)
RETURN discours.titre, discours.date

# Chemin complet : Orateur → Discours → Thème
MATCH path = (orateur)-[:A_PRONONCE]->(discours)-[:CONCERNE]->(theme)
RETURN path
🚀 Chez Le Monde Sémantique

Nous avons choisi RDF pour l'interopérabilité, mais Neo4j reste une excellente alternative pour des cas plus simples.

Comparer avec les Triple Stores →