12 janvier 2014

Neo4j - Cypher - Syntaxe pour décrire les chemins et les graphes

Article précédent: Neo4j - Installation et première utilisation


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.
Le nom, les libellés et les propriétés du noeud ne sont pas obligatoires. Ainsi, l'expression minimale pour créer un noeud peut très bien être vide :
()

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.
Seul le libellé de la relation est obligatoire. Le nom et les propriétés de la relation ne sont pas obligatoires. Ainsi, l'expression minimale pour créer une relation contient le libellé :
[: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.