Aller au contenu principal

Le langage Cypher

Cypher est le langage déclaratif utilisé par Neo4j pour manipuler des bases de données orientées graphe.

déclaratif signifie que l'on décrit ce que l'on souhaite obtenir, et Neo4j choisit la meilleure manière de parcourir le graphe.

Alors que le langage SQL cherche des lignes dans des tables, Cypher cherche des chemins dans un graphe.

Le modèle de données​

Les nœuds (Nodes)​

Les entités de données dans une base de données de graphe Neo4j sont appelées nœuds. Les noeuds sont mentionnés dans Cypher en utilisant des parenthèses ( ).

Par exemple :

  • une personne
  • une entreprise
  • une ville
  • un produit
(p)

Les étiquettes (Labels)​

Les étiquettes sont utilisées pour spécifier le ou les types de nœuds spécifiques. Un nœud peut être assigné à une ou plusieurs étiquettes.

(p:Personne)

(p:Personne:Client)

Les propriétés (Properties)​

Les propriétés sont définies dans des accolades { }, et sont utilisées pour fournir aux nœuds des informations spécifiques. Les propriétés sont comparables aux colonnes d'une table SQL et peuvent également être interrogées pour améliorer la capacité à sélectionner les données.

(p:Personne {
nom: "Dupont",
prenom: "Jean",
age: 32
})

Les variables​

Les variables permettent de référencer des nœuds spécifiés dans les clauses suivantes. Dans les exemples précédent p est une variable.

Les relations (Relationships)​

Les nœuds d'un graphe peuvent être reliés par des relations. Une relation doit avoir un nœud de départ, un nœud de fin, et exactement un type. Les relations sont représentées dans Cypher avec des flèches (par exemple - ->) indiquant la direction de la relation. Contrairement aux nœuds, l'information dans un modèle de relation doit être enfermée par des crochets [ ].

Une relation possède :

  • une direction,
  • une seule étiquette,
  • éventuellement des propriétés.
(p)-[:AMI]->(a)

(p)-[:ACHAT {
date: date(),
montant: 120
}]->(commande)

Les chemins (Paths)​

Les chemins d'un graphe sont constitués de nœuds et de relations connectés. L'exploration de ces chemins se trouve au cœur même de Cypher.

Les motifs (Patterns)​

Un motif est un requête déclarative utilisé pour naviguer, décrire et extraire des données à partir d'un graphe. Toute requête Cypher repose sur un motif.

(Personne)-[:TRAVAILLE_POUR]->(Entreprise)

Un motif de graphe décrit des données à l'aide d'une syntaxe similaire à la manière dont les nœuds et les relations d'un graphe à propriétés sont dessinés sur un tableau blanc. Sur un tableau blanc, les nœuds sont représentés par des cercles et les relations par des flèches. Cypher représente les cercles par une paire de parenthèses (``), et les flèches par des tirets accompagnés du symbole « supérieur à » ou « inférieur à » :

()-->()<--()

Commandes​

CREATE​

Créer un nœud.

CREATE
(:Ville {nom:"Nancy"}),
(:Ville {nom:"Paris"})

Créer une relation. On sélectionne 2 nœuds, puis on créé la route entre les deux nœud.

MATCH
(a:Ville {nom:"Nancy"}),
(b:Ville {nom:"Paris"})
CREATE
(a)-[:ROUTE]->(b)

MATCH​

MATCH recherche des motifs.

Toutes les requêtes commencent généralement par MATCH.

MATCH (p:Personne)
RETURN p

Cette requête signifie :

retrouver tous les nœuds ayant le label Personne.

Recherche avec propriété

MATCH (p:Personne {nom:"Dupont"})
RETURN p

WHERE​

WHERE permet de filtrer.

MATCH (p:Personne)
WHERE p.age > 30
RETURN p

Plusieurs conditions :

WHERE p.age > 30
AND p.ville = "Nancy"

LIKE est remplacé par plusieurs opérateurs.

STARTS WITH

ENDS WITH

CONTAINS

Exemple

MATCH (p:Personne)
WHERE p.nom STARTS WITH "Du"
RETURN p

RETURN​

RETURN indique les informations à afficher.

Retourner le nœud entier :

RETURN p

Seulement quelques propriétés :

RETURN
p.nom,
p.age

Renommer les colonnes :

RETURN
p.nom AS Nom,
p.age AS Age

Les relations​

On peut rechercher des relations.

MATCH
(p)-[:AMI]->(a)

RETURN p,a

On peut ignorer le sens.

MATCH
(p)-[:AMI]-(a)

Ou rechercher le sens inverse.

MATCH
(p)<-[:AMI]-(a)

Plusieurs relations​

Cypher est particulièrement puissant ici.

Deux relations :

MATCH

(p)-[:AMI]->()-[:AMI]->(x)

RETURN x

Le nœud intermédiaire est volontairement anonyme.

Longueur variable​

Cypher sait parcourir un graphe sur plusieurs niveaux.

MATCH

(p)-[:AMI*]->(x)

Tous les chemins.

Limiter :

[:AMI*1..3]

Entre 1 et 3 relations.

Exactement 2 :

[:AMI*2]

MERGE​

MERGE est probablement l'instruction la plus importante après MATCH.

Elle signifie :

retrouve cet élément,

sinon crée-le.

MERGE
(p:Ville {nom:"Nancy"})

Si Nancy existe :

rien n'est créé.

Sinon :

Nancy est créée.


On peut distinguer les deux cas.

MERGE (p:Ville {nom:"Nancy"})

ON CREATE

SET p.creation = datetime()

ON MATCH

SET p.nbAcces =
coalesce(p.nbAcces,0)+1

SET​

Modifier des propriétés.

MATCH (p)
SET p.age = 35

Plusieurs modifications.

SET

p.nom="Martin",
p.age=40

DELETE​

Supprimer un nœud.

DELETE p

Si le nœud possède des relations :

DETACH DELETE p

Les relations sont supprimées automatiquement.

13. REMOVE

Supprimer une propriété.

REMOVE p.age

Supprimer un label.

REMOVE p:Client

14. ORDER BY

Tri.

ORDER BY p.age

Décroissant.

ORDER BY p.age DESC

15. LIMIT

Limiter les résultats.

LIMIT 10

16. Les fonctions d'agrégation

Comme en SQL, vous pouvez utiliser des fonctions d'agrégation

FonctionSyntaxe
Comptercount(p)
Moyenneavg()
Sommesum()
Maximummax()
Minimummin()
MATCH (p)
RETURN count(p)

17. WITH

WITH permet de créer un pipeline.

Exemple.

MATCH (p:Personne)

WITH p

WHERE p.age>30

RETURN p

On peut également agréger.

MATCH (p)

WITH count(*) AS nb

RETURN nb

18. OPTIONAL MATCH

Comparable à un LEFT JOIN.

MATCH (p:Personne)

OPTIONAL MATCH

(p)-[:MARIÉ]->(c)

RETURN p,c

Les personnes sans conjoint sont tout de même retournées.

19. UNWIND

Transformer une liste en lignes.

UNWIND

["Paris","Nancy","Lyon"]

AS ville

RETURN ville

Résultat :

Paris

Nancy

Lyon

20. Les paramètres

Toujours préférer les paramètres.

Au lieu de

MATCH

(p {nom:"Martin"})

écrire

MATCH

(p {nom:$nom})

avec

{
"nom":"Martin"
}

Cela évite les injections et améliore les performances.

21. Les chemins

Cypher peut retourner un chemin complet.

MATCH

chemin=(a)-[:AMI*]->(b)

RETURN chemin

Le résultat contient :

  • les nœuds
  • les relations
  • leur ordre

22. Fonctions utiles

Quelques fonctions intégrées :

labels(n)

type(r)

properties(n)

keys(n)

elementId(n)

Exemple.

MATCH (n)

RETURN labels(n)