Cypher est un langage de requêtes pour Neo4j.
Nous allons voir la syntaxe Cypher pour décrire les graphes.
Modéliser un graphe
Nous décrivons le graphe sous forme textuel en ASCII art.Noeud
Un noeud est décrit par deux parenthèses () pouvant contenir le nom, les libellés et les propriétés du noeud :(name:label {key1:'value1',key2:'value2'})
, avec :- name : il s'agit d'un nom qui identifie temporairement le noeud lors du traitement de l'expression. Il n'est pas stocké dans Neo4j. Ce nom sert en quelque sorte de nom de variable pour faire référence à ce même noeud à plusieurs endroits dans la requête Cypher.
- :label : il s'agit du libellé du noeud.
- il peut y avoir plusieurs labels pour un même noeud, dans ce cas, la syntaxe sera de la forme suivante : :label1:label2
- le libellé permet d'identifier un ensemble de noeuds ayant ce même libellé.
- dans l'expression, le libellé est précédé par deux points : cela permet de distinguer le libellé du nom.
- {key1: 'value1', ... , keyN: 'valueN'} : ce sont les propriétés du noeud définies sous forme de clés / valeurs.
()
Relation
Une relation est décrite par deux crochets [] pouvant contenir le nom, le libellé et les propriétés :[name:label {key1:'value1',key2:'value2'}]
, avec :
- name : il s'agit d'un nom qui identifie temporairement la relation lors du traitement de l'expression. Il n'est pas stocké dans Neo4j. Ce nom sert en quelque sorte de nom de variable pour faire référence à cette même relation à plusieurs endroits dans la requête Cypher.
- :label : il s'agit du libellé de la relation
- le libellé est obligatoire pour la relation
- il ne peut y avoir qu'un seul libellé par relation
- le libellé permet d'identifier un ensemble de relations ayant ce même libellé.
- dans l'expression, le libellé est précédé par deux points : cela permet de le distinguer du nom.
- {key1: 'value1', ... , keyN: 'valueN'} : ce sont les propriétés de la relation définies sous forme de clés / valeurs.
[:label]
Sens de la relation
Une relation n'existe que si elle met en relation deux noeuds existants. Ainsi, de chaque côté des crochets, on ajoute un tiret ainsi que le signe supérieur / inférieur pour indiquer le sens de la relation entre les deux noeuds de la relation.Attention : toutes les relations stockées dans Neo4j sont obligatoirement orientées dans un seul sens.
Nous pouvons avoir :
()-[:label]->() ou ()<-[:label]-()
Lors d'une recherche, il est possible d'ignorer la direction de la relation à l'aide de la syntaxe suivante :
()-[:label]-() ou ()<-[:label]->()
Exemples de graphes
Chemin simple
(a)-[:Lien]->(b)
Chemin de plusieurs noeuds
(a)-[:Lien1]->(b)-[:Lien2]->(c)
Aggréger plusieurs chemins
(a)-[:Lien1]->(b), (a)-[:Lien2]->(c)
Cycle
(a)-[:Lien1]->(b)-[:Lien2]->(c)-[:Lien3]->(a)
Nous verrons dans le prochain article comment créer un graphe complet à l'aide du langage Cypher.