Écrit par Louis Jeanne-Julien
Neo4j : c’est quoi?
Neo4j est un SGBD opensource développé en Java et Scala, disponible depuis début 2010, qui a la particularité de représenter les données sous forme de graphes.
Un serveur Neo4j contient une ou plusieurs bases de données non relationnelles, chacune associée à un graphe. Le graphe est un modèle de données contenu dans la base de données : il n’empêche pas l’utilisateur de lire les données sous forme de lignes, mais permet d’en avoir une vision d’ensemble, et en facilite la lecture.
Neo4j : ça ressemble à quoi?
Pour être simple et exhaustif, un graphe Neo4j, c’est :
- un ensemble de Nodes (représentés sous forme de cercles), de Relationships (représentées sous forme de flèches), et de Properties.
- les Nodes et les Relationships peuvent appartenir à différents types définis par l’utilisateur, appelés Labels : cette appartenance est visible grâce à la couleur du Node. Ces Labels sont l’équivalent des tables dans les DB relationnelles.
- les Nodes et les Relationships possèdent des Properties qui sont des paires clef/valeur.
- les Relationships sont uni- ou bi-directionnelles, et comportent un Node de départ et un Node de fin.
Le DataBrowser de Neo4J permet de visualiser les données sous deux formats, selon le besoin de l’utilisateur :
- UI view : le graphe, dont les données sont exportables en format JSON.
- Grid view : un tableau, dont les données sont exportables en format CSV ou JSON.
Neo4j : pourquoi?
Les principaux avantages de Neo4j résident dans la clarté de la lecture des données et des requêtes :
- La représentation en graphe est particulièrement adaptée lorsque les données sont étroitement liées entre elles, et permet une représentation bien structurée et hiérarchisée.
- Nul besoin d’effectuer des jointures complexes entre des tables pleines de clefs étrangères : il est aisé de naviguer entre les données qui sont reliées.
- Utilisation de CQL (Cypher Query Language) : un langage déclaratif, dont la structure est voisine du SQL, et dont la syntaxe orientée ‘art ascii’ permet de représenter visuellement les requêtes.
- Possible indexation des données pour plus de rapidité d’exécution lors de requêtes complexes sur de grosses applications.
Le langage CQL en quelques commandes
Je veux retrouver :
- un Node selon l’un de ses Labels : MATCH (node:label)
- un Node selon l’une de ses Properties : MATCH (node {key:value})
Je veux créer :
- un Node : CREATE (node)
- un Node appartenant à un Label : CREATE (node:Label)
- un Node possédant une Property : CREATE (node {key:value})
- un Node appartenant à un Label et possédant une Property : CREATE (node:label {key:value})
- une Relationship entre deux Nodes (les Properties sont optionnelles) : CREATE (start node)-[relationship:nom_ou_type_de_la_relation {key1:value1, key2:value2}]->(end node)
Je veux ajouter :
- un Label ou une Property à un Node (le fonctionnement est le même sur une Relationship) : MATCH (n:Label {key:value}) SET n :label
Je veux supprimer :
- un Label ou une Property à un Node (le fonctionnement est le même pour l’ajout sur une Relationship) : MATCH (n:Label {key:value}) REMOVE n :label
- un Node ou une Relationship (l’instruction DETACH permet de supprimer les Relationships du Node avant de le supprimer) : MATCH (n:label {key:value}) DETACH DELETE n
Je veux tout créer d’un coup :
Des Nodes, appartenant à différents Labels, et possédant différentes Properties, liés entre eux par des Relationships
- CREATE (node1:Label1:Label2 {key1:value1, key2:value2, key3:value3})-[relation1:nom_de_la_relation]->(node2:Label1:Label3 {key1:value1, key2:value2, key3:value3})-[relation2:nom_de_la_relation]->(node3:Label4:Label2 {key1:value1, key2:value2, key3:value3})
Un exemple : le Seigneur des Anneaux en base de données
Commençons par créer les protagonistes : les Labels feront office de différentes factions, et nous utiliserons une Property pour attribuer un prénom à chacun.
- Ajoutons ensuite les liens hiérarchiques de rigueur au sein de chaque faction, par exemple :
- Ajoutons enfin les liens entre les membres de chaque faction, par exemple :
- Sur le résultat final, nous voyons les Nodes de différentes couleurs selon leurs Labels:
- bleu : “Gentil”
- rouge : “Mechant” + “Mordor”
- jaune : “Mechant” + “Isengard”
- vert : “Objet”
Neo4j : ils l’ont adopté
J’espère que cette courte introduction vous a donné une idée de la valeur ajoutée apportée par Neo4j, déjà présent au sein de grandes organisations :
Liens
Site web : https://neo4j.com/
Dépôt GitHub : https://github.com/neo4j/neo4j