ALEXANDRE LOUVET


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és title, 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

  1. Réinitialiser la base (vider tous les noeuds et relations).

  2. 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
  3. Créer les relations :

    DIRECTED :

    • Nolan → Inception
    • Nolan → Interstellar
    • Nolan → Dunkirk

    ACTED_IN :

    • Inception ← DiCaprio, Gordon-Levitt, Michael Caine
    • Interstellar ← McConaughey, Michael Caine
  4. Lister les films réalisés par Christopher Nolan** (afficher title, year).

  5. Lister les acteurs du film “Inception”** (afficher name).

  6. Donner les co-acteurs de Leonardo DiCaprio** (personnes ayant joué dans le même film que lui, sans ré-afficher DiCaprio).

  7. Pour chaque film, afficher le nombre d’acteurs reliés par ACTED_IN** (colonnes : title, nb_actors).

  8. 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

  1. Combien de villes sont enregistrées ?

  2. Lister toutes les villes françaises (name, population) triées par population décroissante.

  3. Depuis Paris, lister les villes accessibles en 1 saut via ROUTE.

  4. Trouver la distance Paris → Bruxelles (arête directe).

  5. Calculer le plus court chemin, en nombre d'arêtes, entre Lille et Rome. Afficher la séquence des noms.

  6. Calculer le chemin le plus court pondéré, c'est-à-dire la distance totale minimale, entre Paris et Berlin.

  7. Pour chaque ville, compter le nombre de routes sortantes (degré sortant).

  8. Afficher le Top 3 des villes avec la plus grande population.

  9. Ajouter une nouvelle ville Nice (France, population 342000) et créer une route bidirectionnelle Lyon ↔ Nice de 300 km.

  10. Mettre à jour la population de Lille à 236000.

  11. Supprimer toutes les routes entre Madrid et Paris uniquement.

  12. 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

  1. Afficher tous les livres (titre + année).
  2. Afficher tous les étudiants.
  3. Afficher tous les emprunts (étudiant + livre + date + returned).

5. Requêtes type “jointure SQL”

  1. Afficher les livres avec leur auteur.
  2. Afficher les livres et leur catégorie.
  3. Afficher tous les emprunts avec :
    • étudiant
    • livre
    • auteur
    • date d’emprunt

6. Filtres (WHERE)

  1. Afficher les livres publiés avant 1950.
  2. Afficher les emprunts non rendus.
  3. Afficher les livres empruntés par Amine.

7. Agrégats (COUNT, COLLECT)

  1. Compter combien de livres chaque étudiant a emprunté.
  2. Lister pour chaque auteur la liste des livres écrits.
  3. 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

  1. Modifier le pays de J.K. Rowling → mettre "United Kingdom".
  2. Marquer comme rendu l’emprunt de Samir sur L’Étranger.

10. Suppression

  1. Supprimer l’emprunt de Leila sur Harry Potter.
  2. Supprimer Victor Hugo ainsi que tous ses livres.