Créer des nœuds et des relations en Cypher

@joekakone

Joseph Konka @joekakone

03/03/2026 · 15 min

Maîtrisez la syntaxe déclarative de Cypher dans Neo4j. Apprenez à créer des nœuds avec CREATE et MERGE, à tisser des relations orientées et typées, et à requêter vos graphes avec MATCH et WHERE.

Créer des nœuds et des relations en Cypher#

Le langage Cypher est le cœur battant de Neo4j. Conçu pour être aussi intuitif et expressif que SQL tout en s'adaptant à la nature topologique des réseaux, Cypher repose sur le concept de Pattern Matching (reconnaissance de motifs).

Dans ce cours, nous allons apprendre à manipuler l'ensemble des primitives du modèle Labeled Property Graph (LPG) : création de nœuds, application de labels, définition de propriétés scalaires, tissage de relations orientées, filtrage conditionnel et mise à jour dynamique.


1. La grammaire visuelle de Cypher#

Cypher transpose visuellement l'anatomie d'un réseau en caractères ASCII standards :

flowchart LR
    N1["(p:Person {nom: 'Alice'})<br/>Parenthèses = Nœud"] -->|"-[:TRAVAILLE_AVEC]-><br/>Flèche & Crochets = Relation"| N2["(b:Person {nom: 'Bob'})<br/>Parenthèses = Nœud"]
  • Un Nœud est délimité par des parenthèses () évoquant un cercle sur un schéma :
    (alias:Label {propriete: valeur})
  • Une Relation est délimitée par des crochets [] encadrés de tirets et d'une flèche de direction --> :
    -[alias:TYPE_RELATION {propriete: valeur}]->
  • Un Motif complet (Pattern) exprime le lien direct :
    (nœudSource)-[relation]->(nœudCible)

2. Création de Nœuds avec CREATE et MERGE#

La clause CREATE#

La clause CREATE instancie immédiatement un nouveau nœud ou sous-graphe dans la base de données.

Ouvrez Neo4j Browser sur http://localhost:7474 et saisissez :

// Création d'un nœud avec le label :Person et deux propriétés
CREATE (p:Person {nom: 'Alice Martin', age: 30, ville: 'Paris'})
RETURN p

Nœuds multi-labels et propriétés complexes#

Un même nœud peut arborer plusieurs labels pour traduire différentes facettes de son rôle dans l'organisation :

CREATE (dev:Person:Developpeur:Formateur {
    nom: 'Bob Dubois',
    age: 28,
    competences: ['Python', 'Cypher', 'Docker'],
    actif: true,
    date_embauche: date('2024-01-15')
})
RETURN dev

Le piège des doublons : CREATE vs MERGE#

Si vous exécutez dix fois de suite la commande CREATE (p:Person {nom: 'Alice'}), Neo4j créera dix nœuds distincts portant le même nom (chacun avec un identifiant interne propre).

Pour garantir l'idempotence (c'est-à-dire ne créer l'élément que s'il n'existe pas déjà), utilisez MERGE (Get or Create) :

MERGE (u:Utilisateur {email: 'claire@algojungle.com'})
ON CREATE SET 
    u.nom = 'Claire Laurent',
    u.date_creation = datetime(),
    u.visites = 1
ON MATCH SET 
    u.derniere_connexion = datetime(),
    u.visites = u.visites + 1
RETURN u

[!TIP] - ON CREATE SET : S'exécute uniquement si le nœud vient d'être créé. - ON MATCH SET : S'exécute si le nœud existait déjà en base de données.


3. Tisser des Relations entre Nœuds#

En théorie des graphes, une entité isolée ne produit que peu de valeur. Tout le potentiel réside dans les relations reliant les nœuds.

[!IMPORTANT] Règle absolue : Dans Neo4j, une relation a toujours un nœud de départ, un nœud d'arrivée, un type en majuscules (ex: :AMIS_AVEC, :APPARTIENT_A) et une direction sémantique.

Méthode 1 : Relier deux nœuds existants#

On utilise d'abord MATCH pour identifier les deux nœuds cibles, puis CREATE ou MERGE pour forger la relation :

MATCH (alice:Person {nom: 'Alice Martin'})
MATCH (bob:Person {nom: 'Bob Dubois'})
CREATE (alice)-[r:COLLABORATEUR_DE {depuis: 2023, departement: 'R&D'}]->(bob)
RETURN alice, r, bob

Méthode 2 : Créer le graphe complet en une seule instruction#

CREATE (algo:Entreprise {nom: 'AlgoJungle', secteur: 'EdTech', fondation: 2020})
CREATE (david:Person {nom: 'David Cohen', age: 35})
CREATE (david)-[:FONDATEUR_DE {annee: 2020}]->(algo)
CREATE (david)-[:TRAVAILLE_POUR {role: 'Lead Architect', plein_temps: true}]->(algo)

Dans cet exemple, David possède deux relations distinctes avec AlgoJungle : il en est à la fois le fondateur et un employé en poste. Le modèle LPG permet d'empiler autant de relations sémantiques que nécessaire entre deux mêmes nœuds !


4. Interroger le Graphe avec MATCH et WHERE#

La clause MATCH recherche tous les sous-graphes qui correspondent au motif dessiné.

1. Requête simple et projection#

// Récupérer le nom de toutes les personnes et le nom de l'entreprise où elles travaillent
MATCH (p:Person)-[:TRAVAILLE_POUR]->(e:Entreprise)
RETURN p.nom AS Employe, e.nom AS Entreprise

2. Filtrage avancé avec WHERE#

MATCH (p:Person)-[rel:COLLABORATEUR_DE]->(ami:Person)
WHERE p.age >= 28 AND rel.departement = 'R&D'
RETURN p.nom, ami.nom, rel.depuis

3. Recherche sans sens de flèche#

Si vous souhaitez interroger une amitié ou une collaboration symétrique sans vous soucier de qui est le nœud source :

// Les deux tirets sans pointe de flèche parcourent les relations dans les deux sens
MATCH (a:Person {nom: 'Alice Martin'})-[:COLLABORATEUR_DE]-(b:Person)
RETURN b.nom AS Collegue

4. Relations à longueur variable (Traversée multi-sauts)#

C'est ici que Neo4j surclasse tous les SGBDR traditionnels. Imaginons un réseau de recommandations ou de transmission :

// Trouver toutes les personnes accessibles depuis Alice en 1 à 3 sauts de collaboration
MATCH (alice:Person {nom: 'Alice Martin'})-[:COLLABORATEUR_DE*1..3]->(cible:Person)
RETURN DISTINCT cible.nom, cible.ville

La notation *1..3 demande à Neo4j d'explorer le voisinage à 1, 2 ou 3 degrés de profondeur en une seule ligne de code !


5. Mise à jour et Suppression#

Modifier des propriétés avec SET#

MATCH (p:Person {nom: 'Alice Martin'})
SET p.age = 31, p.email = 'alice.martin@pro.fr', p:VIP
RETURN p
L'instruction SET p:VIP ajoute dynamiquement un nouveau label au nœud sans impacter les données existantes.

Supprimer une propriété avec REMOVE#

MATCH (p:Person {nom: 'Alice Martin'})
REMOVE p.ville, p:VIP
RETURN p

Suppression avec DELETE vs DETACH DELETE#

[!WARNING] Dans Neo4j, vous ne pouvez pas supprimer un nœud s'il possède encore des relations actives. Le moteur refuse l'opération pour empêcher la création d'« arcs orphelins ».

Pour supprimer un nœud et l'ensemble de ses relations connectées de manière atomique :

// Supprimer Bob et couper automatiquement toutes ses relations
MATCH (b:Person {nom: 'Bob Dubois'})
DETACH DELETE b

Pour réinitialiser complètement une base de données de test (supprimer absolument tous les nœuds et toutes les relations) :

MATCH (n)
DETACH DELETE n

6. Agrégations et calculs de synthèse#

Comme en SQL, Cypher intègre des fonctions de réduction statistique, avec une syntaxe plus concise :

// Nombre de collaborateurs et âge moyen par entreprise
MATCH (p:Person)-[:TRAVAILLE_POUR]->(e:Entreprise)
RETURN 
    e.nom AS Entreprise, 
    count(p) AS Effectif, 
    round(avg(p.age), 1) AS AgeMoyen,
    collect(p.nom) AS ListeEmployes
ORDER BY Effectif DESC

La fonction collect() est particulièrement remarquable : elle agrège les valeurs scalaires des nœuds parcourus sous la forme d'un tableau natif Cypher sans aucune gymnastique de syntaxe.


7. Exercice pratique guidé#

Appliquons ces notions sur un cas d'école : modéliser un graphe d'apprentissage de technologies.

Exécutez le script Cypher suivant dans votre console :

// 1. Création des cours
MERGE (c1:Cours {titre: 'Python', niveau: 'Débutant'})
MERGE (c2:Cours {titre: 'Bases de Données SQL', niveau: 'Intermédiaire'})
MERGE (c3:Cours {titre: 'Neo4j & Graphes', niveau: 'Avancé'})

// 2. Définition des prérequis d'apprentissage
MERGE (c1)-[:PREREQUIS_DE]->(c2)
MERGE (c2)-[:PREREQUIS_DE]->(c3)

// 3. Inscription d'étudiants
MERGE (etu:Person {nom: 'Marc V'})
MERGE (etu)-[:A_COMPLETE {score: 95}]->(c1)
MERGE (etu)-[:EST_INSCRIT_A]->(c2)

// 4. Requête : Quels cours Marc doit-il encore valider pour pouvoir suivre 'Neo4j & Graphes' ?
MATCH (cible:Cours {titre: 'Neo4j & Graphes'})<-[:PREREQUIS_DE*1..2]-(requis:Cours)
WHERE NOT (:Person {nom: 'Marc V'})-[:A_COMPLETE]->(requis)
RETURN requis.titre AS CoursARealiser

Sortie attendue :

CoursARealiser
"Bases de Données SQL"


Vous maîtrisez à présent la syntaxe Cypher essentielle ! Dans le chapitre suivant, nous allons développer un cas d'entreprise complet modélisant un réseau social professionnel et implémenter un véritable moteur de recommandation d'amis et d'offres d'emploi couplé à Python.

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue