Sujet de TP: Introduction à Neo4j et au langage Cypher
S1 2026-2027 - IUT - Université de Lille, BUT3 SD
Objectif
Se familiariser avec Cypher : création, lecture, mise à jour et recherches de chemins.
Exécuter les blocs dans Neo4j Browser.
Exercice 1 — Créer un petit graphe « films–personnes »
Contraintes
Labels :
:Movie(propriétéstitle,year):Person(propriéténame)
Relations dirigées :
(:Person)-[:DIRECTED]->(:Movie)(réalisateur → film)(:Person)-[:ACTED_IN]->(:Movie)(acteur → film)
Utiliser MERGE pour créer (évite les doublons) et DETACH DELETE pour supprimer.
Questions
Réinitialiser la base (vider tous les noeuds et relations).
Créer les noeuds :
Films (
:Movie) :- Inception (2010)
- Interstellar (2014)
- Dunkirk (2017)
Personnes (
:Person) :- Christopher Nolan
- Leonardo DiCaprio
- Joseph Gordon-Levitt
- Matthew McConaughey
- Michael Caine
Créer les relations :
DIRECTED:- Nolan → Inception
- Nolan → Interstellar
- Nolan → Dunkirk
ACTED_IN:- Inception ← DiCaprio, Gordon-Levitt, Michael Caine
- Interstellar ← McConaughey, Michael Caine
Lister les films réalisés par Christopher Nolan** (afficher
title,year).Lister les acteurs du film “Inception”** (afficher
name).Donner les co-acteurs de Leonardo DiCaprio** (personnes ayant joué dans le même film que lui, sans ré-afficher DiCaprio).
Pour chaque film, afficher le nombre d’acteurs reliés par
ACTED_IN** (colonnes :title,nb_actors).Supprimer le film Dunkirk et vérifier que toutes ses relations sont bien supprimées (montrez une requête de contrôle).
Exercice 2 — Villes et routes
Mise en place
0) RESET (optionnel)
MATCH (n)
DETACH DELETE n;1) Contraintes / Index
CREATE CONSTRAINT ON (c:City)
ASSERT c.name IS UNIQUE;
CREATE INDEX ON :City(countryCode);2) Création des villes
WITH [
{name:'Paris', country:'France', population:2148000},
{name:'Lille', country:'France', population:232000},
{name:'Lyon', country:'France', population:522000},
{name:'Marseille', country:'France', population:861000},
{name:'Bruxelles', country:'Belgique', population:185000},
{name:'Londres', country:'Royaume-Uni', population:8982000},
{name:'Amsterdam', country:'Pays-Bas', population:872000},
{name:'Berlin', country:'Allemagne', population:3769000},
{name:'Rome', country:'Italie', population:2873000},
{name:'Madrid', country:'Espagne', population:3223000}
] AS cities
UNWIND cities AS c
MERGE (city:City {name:c.name})
SET city.country = c.country,
city.population = c.population;3) Création des routes bidirectionnelles
WITH [
['Paris','Lille',225],
['Paris','Lyon',465],
['Paris','Bruxelles',315],
['Paris','Londres',455],
['Lille','Bruxelles',120],
['Lille','Amsterdam',285],
['Bruxelles','Amsterdam',210],
['Amsterdam','Berlin',655],
['Lyon','Marseille',315],
['Lyon','Rome',1020],
['Marseille','Madrid',1000],
['Madrid','Paris',1050],
['Berlin','Rome',1500],
['Londres','Amsterdam',520]
] AS routes
UNWIND routes AS r
MATCH (a:City {name:r[0]}),
(b:City {name:r[1]})
MERGE (a)-[:ROUTE {distance:r[2]}]->(b)
MERGE (b)-[:ROUTE {distance:r[2]}]->(a);Questions
Combien de villes sont enregistrées ?
Lister toutes les villes françaises (
name,population) triées par population décroissante.Depuis Paris, lister les villes accessibles en 1 saut via
ROUTE.Trouver la distance Paris → Bruxelles (arête directe).
Calculer le plus court chemin, en nombre d'arêtes, entre Lille et Rome. Afficher la séquence des noms.
Calculer le chemin le plus court pondéré, c'est-à-dire la distance totale minimale, entre Paris et Berlin.
Pour chaque ville, compter le nombre de routes sortantes (degré sortant).
Afficher le Top 3 des villes avec la plus grande population.
Ajouter une nouvelle ville
Nice(France, population342000) et créer une route bidirectionnelle Lyon ↔ Nice de300 km.Mettre à jour la population de Lille à
236000.Supprimer toutes les routes entre Madrid et Paris uniquement.
Bonus. Trouver toutes les villes atteignables depuis Paris en au plus 3 sauts, sans répéter les villes.
Exercice 3 — Étudiants, livres, auteurs et catégories
1. Initialisation de la base
Supprimez tous les nœuds et relations de la base Neo4j.
2. Création des nœuds
Étudiants
- Amine (21 ans)
- Leila (22 ans)
- Samir (20 ans)
- Nour (23 ans)
Auteurs
- Victor Hugo (France)
- Albert Camus (France)
- J.K. Rowling (UK)
Livres
- Les Misérables (1862)
- L’Étranger (1942)
- Harry Potter (1997)
Catégories
- Roman
- Philosophie
- Fantastique
Créer tous ces nœuds avec CREATE.
3. Création des relations
Relations Livre → Auteur
- Les Misérables → Victor Hugo
- L’Étranger → Albert Camus
- Harry Potter → J.K. Rowling
Relations Livre → Catégorie
- Les Misérables → Roman
- L’Étranger → Philosophie
- Harry Potter → Fantastique
Relations Étudiant → Livre (BORROWED)
La relation BORROWED contient 2 propriétés :
date(format texte)returned(true/false)
Créer les emprunts suivants :
- Amine emprunte Les Misérables → 2024-01-10, non rendu
- Leila emprunte Harry Potter → 2024-01-15, rendu
- Samir emprunte L’Étranger → 2024-01-12, non rendu
- Amine emprunte Harry Potter → 2024-01-20, rendu
4. Requêtes de base
- Afficher tous les livres (titre + année).
- Afficher tous les étudiants.
- Afficher tous les emprunts (étudiant + livre + date +
returned).
5. Requêtes type “jointure SQL”
- Afficher les livres avec leur auteur.
- Afficher les livres et leur catégorie.
- Afficher tous les emprunts avec :
- étudiant
- livre
- auteur
- date d’emprunt
6. Filtres (WHERE)
- Afficher les livres publiés avant 1950.
- Afficher les emprunts non rendus.
- Afficher les livres empruntés par Amine.
7. Agrégats (COUNT, COLLECT)
- Compter combien de livres chaque étudiant a emprunté.
- Lister pour chaque auteur la liste des livres écrits.
- Compter combien de livres existe dans chaque catégorie.
8. Chemins dans le graphe
Trouver un chemin (shortestPath) entre un étudiant et l’auteur d’un livre qu’il a emprunté.
Afficher le chemin.
9. Mise à jour
- Modifier le pays de J.K. Rowling → mettre
"United Kingdom". - Marquer comme rendu l’emprunt de Samir sur L’Étranger.
10. Suppression
- Supprimer l’emprunt de Leila sur Harry Potter.
- Supprimer Victor Hugo ainsi que tous ses livres.