TP : Découverte de Neo4j et du langage Cypher
Objectif
Apprendre à :
- Comprendre les bases de données orientées graphes.
- Installer et configurer Neo4j.
- Manipuler les données de graphe avec Cypher (création de noeuds, relations, requêtes).
- Interroger et analyser des données de graphe.
Prérequis
- Avoir Neo4j installé sur votre machine (ou accéder à une instance Neo4j dans le cloud).
- Avoir accès à Neo4j Browser ou Neo4j Desktop.
Partie 1 : Mise en place de l'environnement
- Installation de Neo4j : Suivez les instructions d'installation de Neo4j pour votre système d'exploitation depuis le site officiel Neo4j Download Center.
- Lancer Neo4j : Une fois installé, démarrez le serveur Neo4j et ouvrez le Neo4j Browser pour commencer.
- Créer un projet dans Neo4j Browser : Dans Neo4j Browser, créez un nouveau projet que vous appellerez "TP_Neo4j".
Introduction aux bases de données orientées graphe
Neo4j est une base de données orientée graphe, idéale pour gérer des réseaux sociaux, des chaînes logistiques, des réseaux de dépendance, etc. Dans ce modèle :
- Noeuds : Les entités de votre graphe (par exemple :
Person
,City
). - Relations : Les connexions entre les noeuds (par exemple :
FRIEND
,LIVES_IN
). - Propriétés : Attributs stockés pour chaque noeud ou relation (par exemple :
name
,age
,date
).
Mise en place de Neo4j
Installation de Neo4j
- Télécharger Neo4j : Rendez-vous sur Neo4j Download Center pour télécharger la version compatible avec votre système d'exploitation.
- Installer Neo4j Desktop :
- Suivez les instructions d'installation fournies sur le site.
- Lancez Neo4j Desktop et créez un projet en cliquant sur “New Project” (nommez-le "TP_Neo4j").
- Créez une base de données (Database) dans votre projet et démarrez-la.
- Accéder à Neo4j Browser :
- Ouvrez
Neo4j Browser
pour exécuter les requêtes Cypher. - Par défaut, accédez-y à l'adresse suivante :
http://localhost:7474
.
- Ouvrez
- Se connecter :
- Par défaut, utilisez l'utilisateur
neo4j
et le mot de passe défini lors de l’installation.
- Par défaut, utilisez l'utilisateur
Modélisation du graphe : Cas d'un réseau social simple
Dans ce TP, nous allons modéliser un réseau social. Voici les éléments principaux :
- Noeuds :
Person
: chaque personne possède des attributsname
,age
, etcity
.City
: ville avec l'attributname
.
- Relations :
FRIEND
: relation d'amitié entre deux personnes.LIVES_IN
: relation entre une personne et sa ville.
- Exemple de données :
- Noeuds :
- Alice, 30 ans, vit à Paris.
- Bob, 25 ans, vit à Lyon.
- Carol, 35 ans, vit à Paris.
- Relations :
- Alice est amie avec Bob et Carol.
- Alice et Carol vivent à Paris ; Bob vit à Lyon.
- Noeuds :
Création du graphe avec Cypher
Étape 1 : Création des noeuds
- Dans Neo4j Browser, exécutez les commandes Cypher pour créer les noeuds.
CREATE (a:Person {name: 'Alice', age: 30, city: 'Paris'});
CREATE (b:Person {name: 'Bob', age: 25, city: 'Lyon'});
CREATE (c:Person {name: 'Carol', age: 35, city: 'Paris'});
CREATE (paris:City {name: 'Paris'});
CREATE (lyon:City {name: 'Lyon'});
Étape 2 : Création des relations
- Maintenant, créez les relations entre les noeuds.
// Amis
MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:FRIEND]->(b);
MATCH (a:Person {name: 'Alice'}), (c:Person {name: 'Carol'})
CREATE (a)-[:FRIEND]->(c);
// Lien avec les villes
MATCH (a:Person {name: 'Alice'}), (paris:City {name: 'Paris'})
CREATE (a)-[:LIVES_IN]->(paris);
MATCH (c:Person {name: 'Carol'}), (paris:City {name: 'Paris'})
CREATE (c)-[:LIVES_IN]->(paris);
MATCH (b:Person {name: 'Bob'}), (lyon:City {name: 'Lyon'})
CREATE (b)-[:LIVES_IN]->(lyon);
- Vérifiez que vos noeuds et relations ont été correctement créés en exécutant :
MATCH (n) RETURN n;
Manipulation des données
Ajouter des informations supplémentaires
- Ajouter un nouveau noeud pour David, un ami de Bob vivant à Lyon
CREATE (d:Person {name: 'David', age: 28, city: 'Lyon'});
MATCH (b:Person {name: 'Bob'}), (d:Person {name: 'David'})
CREATE (b)-[:FRIEND]->(d);
MATCH (d:Person {name: 'David'}), (lyon:City {name: 'Lyon'})
CREATE (d)-[:LIVES_IN]->(lyon);
Modifier des données
- Changer la ville de Bob pour Paris :
MATCH (b:Person {name: 'Bob'})
SET b.city = 'Paris';
MATCH (b)-[r:LIVES_IN]->(lyon:City {name: 'Lyon'})
DELETE r;
MATCH (b), (paris:City {name: 'Paris'})
CREATE (b)-[:LIVES_IN]->(paris);
Requêtes Cypher : Interroger le graphe
Requêtes de base
- Lister les noms de toutes les personnes :
MATCH (p:Person) RETURN p.name;
- Trouver les personnes vivant à Paris :
MATCH (p:Person)-[:LIVES_IN]->(c:City {name: 'Paris'})
RETURN p.name;
- Trouver tous les amis d'Alice :
MATCH (a:Person {name: 'Alice'})-[:FRIEND]->(friend)
RETURN friend.name;
- Trouver les amis des amis de Bob :
MATCH (b:Person {name: 'Bob'})-[:FRIEND]->()-[:FRIEND]->(fof)
RETURN DISTINCT fof.name;
Requêtes avancées
- Trouver toutes les personnes âgées de plus de 30 ans et vivant à Paris :
MATCH (p:Person)-[:LIVES_IN]->(c:City {name: 'Paris'})
WHERE p.age > 30
RETURN p.name, p.age;
- Lister toutes les personnes avec leur nombre d’amis :
MATCH (p:Person)-[:FRIEND]->(f)
RETURN p.name AS person, COUNT(f) AS friend_count
ORDER BY friend_count DESC;
- Lister toutes les villes avec le nombre d’habitants :
MATCH (c:City)<-[:LIVES_IN]-(p:Person)
RETURN c.name AS city, COUNT(p) AS population
ORDER BY population DESC;
7. Suppression de noeuds et relations
- Supprimer la relation d'amitié entre Alice et Carol :
MATCH (a:Person {name: 'Alice'})-[r:FRIEND]->(c:Person {name: 'Carol'})
DELETE r;
- Supprimer un noeud et toutes ses relations (par exemple, le noeud David) :
MATCH (d:Person {name: 'David'})
DETACH DELETE d;
Export des résultats
- Exporter une requête en CSV (optionnel) :
- Neo4j permet d’exporter le résultat de requêtes en CSV. Par exemple, pour exporter les personnes et leur nombre d'amis :
CALL apoc.export.csv.query(
"MATCH (p:Person)-[:FRIEND]->(f) RETURN p.name AS person, COUNT(f) AS friend_count",
"/path/to/export/friends_count.csv",
{}
)
Chargement de données avec LOAD CSV
Objectif de cette partie
Nous allons voir comment :
- Charger un fichier CSV contenant des données.
- Créer des noeuds et des relations en utilisant les données importées.
- Utiliser
LOAD CSV
pour des imports plus complexes.
Exemple de fichier CSV
Supposons que vous ayez un fichier persons.csv
qui contient des informations sur des personnes et un autre fichier friendships.csv
qui contient des relations d'amitié entre elles.
Structure des fichiers CSV
Fichier persons.csv
(personnes avec leurs attributs) :
name,age,city
Alice,30,Paris
Bob,25,Lyon
Carol,35,Paris
David,28,Lyon
Fichier friendships.csv
(amitiés entre personnes) :
person1,person2
Alice,Bob
Alice,Carol
Bob,David
Ces fichiers doivent être placés dans un répertoire accessible par Neo4j. Si vous utilisez Neo4j Desktop, vous pouvez placer vos fichiers dans le répertoire import
du dossier de la base de données (souvent situé sous neo4j/data/databases/<nom_base>/import
).
Importer les noeuds de personnes
Pour charger les personnes et créer des noeuds, nous allons utiliser LOAD CSV
:
Exécuter la commande suivante dans Neo4j Browser pour importer chaque ligne de persons.csv
en tant que noeud Person
.
LOAD CSV WITH HEADERS FROM 'file:///persons.csv' AS row
CREATE (p:Person {name: row.name, age: toInteger(row.age), city: row.city});
LOAD CSV WITH HEADERS
: indique que le fichier CSV contient une ligne d'en-têtes.AS row
: chaque ligne est appeléerow
et ses colonnes sont accessibles parrow.nom_colonne
.toInteger(row.age)
: transforme la valeur deage
en entier.
Vérifiez les noeuds créés :
MATCH (p:Person) RETURN p;
Importer les noeuds de villes (optionnel)
Si les villes sont listées séparément, vous pouvez les charger depuis un fichier cities.csv
(structure : name
), avec la commande :
LOAD CSV WITH HEADERS FROM 'file:///cities.csv' AS row
MERGE (c:City {name: row.name});
MERGE
assure qu’une ville n'est créée qu'une seule fois, même si elle est mentionnée plusieurs fois.
Créer des relations d'amitié entre personnes
Une fois les noeuds de Person
créés, importez les relations FRIEND
depuis friendships.csv
:
Exécuter la commande suivante pour établir des relations d’amitié :
LOAD CSV WITH HEADERS FROM 'file:///friendships.csv' AS row
MATCH (p1:Person {name: row.person1})
MATCH (p2:Person {name: row.person2})
CREATE (p1)-[:FRIEND]->(p2);
- Ici, nous utilisons
MATCH
pour trouver les noeuds correspondant aux noms dansfriendships.csv
, puisCREATE
pour créer une relationFRIEND
entre eux. - Ce chargement suppose que les noms sont uniques pour chaque personne dans le graphe.
Vérifiez les relations créées :
MATCH (p1:Person)-[:FRIEND]->(p2:Person) RETURN p1.name, p2.name;
Import plus complexe : chargement de villes avec relations LIVES_IN
Si vous souhaitez créer des noeuds de villes en même temps que vous chargez des personnes et établir la relation LIVES_IN
:
LOAD CSV WITH HEADERS FROM 'file:///persons.csv' AS row
MERGE (c:City {name: row.city})
CREATE (p:Person {name: row.name, age: toInteger(row.age)})
CREATE (p)-[:LIVES_IN]->(c);
Dans cet exemple, chaque ligne du fichier persons.csv
:
- Crée un noeud
City
s'il n'existe pas déjà (grâce àMERGE
). - Crée un noeud
Person
avec les propriétés indiquées. - Crée une relation
LIVES_IN
reliant la personne à sa ville.
Requêtes de vérification
Après le chargement, exécutez les requêtes suivantes pour vérifier vos données :
Lister toutes les personnes et leurs villes :
MATCH (p:Person)-[:LIVES_IN]->(c:City)
RETURN p.name, p.age, c.name AS city;
Lister toutes les relations d'amitié :
MATCH (p1:Person)-[:FRIEND]->(p2:Person)
RETURN p1.name AS Person1, p2.name AS Person2;
Afficher tout le graphe pour visualiser les connexions :
MATCH (n) RETURN n;
Conclusion
Avec LOAD CSV
, Neo4j permet d'importer des fichiers CSV et de transformer ces données en noeuds et relations, facilitant ainsi l'intégration de données externes. Ce processus est particulièrement utile pour les jeux de données volumineux où la création manuelle serait laborieuse.
En continuant, vous pouvez essayer de charger des données réelles, par exemple des réseaux de transport, des réseaux sociaux plus grands, ou des réseaux de collaboration pour vous familiariser davantage avec LOAD CSV
.