Vue d’ensemble
Un modèle de chemin sert à faire correspondre des chemins dans le graph et se compose de trois parties successives :
- Déclaration de Variable de Chemin (Optionnelle)
- Préfixe de Modèle de Chemin (Optionnel)
- Expression de Modèle de Chemin
<path pattern> ::=
[ <path variable declaration> ] [ <path pattern prefix> ] <path pattern expression>
Expression de Modèle de Chemin
L'expression de modèle de chemin est le cœur d'un modèle de chemin. Elle spécifie la séquence réelle de node et edge qui composent le chemin qui (1) commence et se termine par un node, et (2) alterne entre nodes et edges. Un chemin peut comprendre un seul node.
Une expression de modèle de chemin peut être un simple terme de chemin, une union de modèles de chemin, ou une alternance de multiensembles de chemin; les deux derniers combinent plusieurs termes de chemin.
<path pattern expression> ::=
<path term> | <path pattern union> | <path multiset alternation>
Terme de Chemin
Un terme de chemin consiste en un singleton ou une concaténation de modèles d'éléments, de modèles de chemins entre parenthèses, et de modèles de chemins quantifiés, en respectant les règles topologiques d'un chemin.
<path term> ::= <path factor> [ <path factor>... ]
<path factor> ::=
<element pattern> | <parenthesized path pattern> | <quantified path pattern>
1. Modèle d'Élément
Les modèles d'éléments peuvent être concaténés de manière récursive pour construire un chemin.
Ce modèle de chemin part de Brainy
, se connectant à un node étiqueté Club
via un edge sortant étiqueté Joins
, où p
est la variable du chemin :
p = (:User {name: 'Brainy'})-[:Joins]->(:Club)
Vous pouvez continuer à enchaîner les modèles de edge et de node pour créer des modèles de chemin plus complexes. Ce modèle de chemin plus long décrit que Brainy
et mochaeach
ont tous deux rejoint certains clubs, le node club étant lié à la variable c
:
(:User {name: 'Brainy'})-[:Joins]->(c:Club)<-[:Joins]-(:User {name: 'mochaeach'})
Ce modèle de chemin réutilise la variable a
pour former une structure en anneau qui commence et se termine par le même node :
(a:Account)-[:Owns]->(:Card)-[:Transfers]->(:Card)-[:Transfers]->(:Card)<-[:Owns]-(a)
Lorsque deux modèles de node sont concaténés consécutivement, ils se lient au même node en considérant toutes les conditions de filtrage de manière conjonctive. Dans cet exemple, u1
et u2
fusionnent implicitement en (u1|u2:User {name: "Claire"})
(L'opérateur d'union |
ici est uniquement à des fins d'illustration) :
(u1:User)(u2 {name: "claire"})-[:Follows]-(u3)
La juxtaposition des modèles de node est actuellement uniquement prise en charge pour les modèles de chemins quantifiés.
Deux modèles de edge consécutifs ont conceptuellement un modèle de node vide entre eux. Dans cet exemple, le modèle de chemin s'étend implicitement à (:User)-[]-()-[]-(u)
:
(:User)-[]--[]-(u)
Une expression de chemin ne doit pas juxtaposer un token qui expose un signe moins à droite (
]-
,<-
,-
) suivi d'un token exposant un signe moins à gauche (-[
,->
,-
), car cette combinaison introduit le symbole de commentaire--
. Voir Commentaires.
2. Modèle de Chemin Parenthésé
Vous pouvez enfermer un sous-chemin ou le chemin entier dans une paire de parenthèses correspondantes ()
pour former un modèle de chemin parenthésé :
<parenthesized path pattern> ::=
"(" [ <path mode prefix> ]
<path pattern expression>
[ <parenthesized path pattern where clause> ] ")"
Le modèle de chemin parenthésé peut actuellement être utilisé uniquement avec un quantificateur pour former un modèle de chemin quantifié.
3. Modèle de Chemin Quantifié
Un quantificateur peut être apposé à un modèle de edge ou à un modèle de chemin parenthésé pour former un modèle de chemin quantifié, construisant un chemin de longueur variable.
Union de Modèles de Chemin & Alternance de Multiensembles de Chemin
<path pattern union> ::=
<path term> "|" <path term> [ { "|" <path term> }... ]
<path multiset alternation> ::=
<path term> "|+|" <path term> [ { "|+|" <path term> }... ]
L'union de modèles de chemin combine les termes de chemin à l'aide de la barre verticale |
. Elle fusionne les enregistrements liés à la même variable tout en garantissant que les doublons sont supprimés.
MATCH (:Club {code: "C01"})<-[:Joins]-(u:User) | (:Club {code: "C02"})<-[:Joins]-(u:User)
RETURN COLLECT_LIST(u.name) AS names
Résultat :
noms |
---|
["rowlock", "lionbower", "mochaeach"] |
L'alternance de multiensembles de chemin combine les termes de chemin à l'aide de l'opérateur d'alternance de multiensemble |+|
. Elle fusionne les enregistrements liés à la même variable tout en garantissant que les doublons sont retenus.
MATCH (:Club {code: "C01"})<-[:Joins]-(u:User) |+| (:Club {code: "C02"})<-[:Joins]-(u:User)
RETURN COLLECT_LIST(u.name) AS names
Résultat :
noms |
---|
["rowlock", "lionbower", "lionbower", "mochaeach"] |
Chaque terme de chemin dans l'union de modèles de chemin ou l'alternance de multiensembles de chemin ne peut référencer que des variables d'élément déclarées dans le terme de chemin. Par exemple, la requête suivante génère une erreur de syntaxe :
MATCH (:Club {code: "C01"})<-[]-(a) |
(:Club {code: "C02"})<-[]-(b WHERE a.name = b.name)
RETURN a, b
Préfixe de Modèle de Chemin
Il existe deux types de préfixes de modèle de chemin, préfixe de mode de chemin et préfixe de recherche de chemin qui peuvent être spécifiés pour restreindre ou sélectionner les résultats correspondants.
<path pattern prefix> ::= <path mode prefix> | <path search prefix>
<path mode prefix> ::= "TRAIL" | "SIMPLE" | "ACYCLIC" | "WALK"
<path search prefix> ::= <all path> | <any path> | <shortest path>
<all path> ::= "ALL" [ <path mode> ]
<any path> ::= "ANY" [ <non negative integer> ] [ <path mode> ]
<shortest path> ::=
"ALL SHORTEST" [ <path mode prefix> ]
| "ANY SHORTEST" [ <path mode prefix> ]
| "SHORTEST" <non negative integer> [ <path mode prefix> ]
| "SHORTEST" [ <non negative integer> ] [ <path mode prefix> ] < "GROUP" | "GROUPS" >
Préfixe de Mode de Chemin
Les préfixes de mode de chemin (ou restrictifs) contrôlent comment les chemins sont parcourus et si les nodes ou edges peuvent être revisités. Un restrictif peut être placé soit en tête d'une expression de modèle de chemin, soit en tête d'un modèle de chemin parenthésé.
Restrictif |
Description |
---|---|
TRAIL |
Par défaut. Les chemins avec des edges répétés ne sont pas retournés. |
ACYCLIC |
Les chemins avec des nodes répétés ne sont pas retournés. |
SIMPLE |
Les chemins avec des nodes répétés ne sont pas retournés à moins que ces nodes répétés soient le premier et le dernier dans le chemin. |
WALK |
Il est non restrictif. |
Les restrictifs
ACYCLIC
,SIMPLE
etWALK
ne sont pas encore pris en charge.
Préfixe de Recherche de Chemin
Les préfixes de recherche de chemin (ou sélecteurs) sélectionnent un ensemble fini de correspondances dans chaque partition[1]. Un sélecteur peut être placé uniquement en tête d'une expression de modèle de chemin.
Sélecteur |
Description |
---|---|
ALL |
Par défaut. Il n'est pas sélectif. |
ANY |
Sélectionne un chemin dans chaque partition. Non déterministe. |
ANY k |
Sélectionne k [2] chemins dans chaque partition. Non déterministe. |
ALL SHORTEST |
Sélectionne tous les chemins les plus courts dans chaque partition. |
SHORTEST k |
Sélectionne k chemins les plus courts dans chaque partition. Non déterministe. |
SHORTEST k GROUP |
Regroupe les chemins par longueur et trie les groupes en ordre croissant par longueur. Ensuite, sélectionne tous les chemins dans les k premiers groupes dans chaque partition. Déterministe. |
[1] Les chemins correspondants au modèle de chemin sont conceptuellement partitionnés par des paires distinctes de nodes de début et de fin.
[2] k
est un entier non-négatif. Si moins de k
chemins existent, tous sont conservés. Lorsque k
est manquant, il prend par défaut la valeur 1.
Référez-vous à Chemins les Plus Courts pour plus d'informations sur les sélecteurs les plus courts. Lorsqu'un sélecteur le plus court est utilisé, le mode de chemin est obligatoirement défini sur TRAIL
.
Les sélecteurs
ANY
etANY k
ne sont pas encore pris en charge. L'utilisation explicite deALL
n'est pas non plus prise en charge.
Utilisation Combinée
Vous pouvez utiliser soit des restrictifs, soit les deux, et des sélecteurs dans un modèle de chemin. Les restrictifs peuvent être vus comme opérant pendant la correspondance de modèle tandis que les sélecteurs opèrent après.
Cette requête retourne un seul chemin acyclique arbitraire à partir de la carte C01
, passant par 1 à 3 edges sortants Transfers
vers une autre carte :
MATCH p = ANY ACYCLIC (c:Card {_id: 'C01'})-[:Transfers]->{1,3}(:Card)
RETURN p
L'expression du modèle de chemin pourrait potentiellement trouver 5 chemins. Premièrement, le chemin comprenant un node répété C02
est supprimé par le restrictif ACYCLIC
. Le sélecteur ANY
choisit alors aléatoirement un chemin dans chaque partition. En tout, trois chemins sont retournés.
Variable de Chemin
Une variable de chemin est déclarée en tête d'une expression de modèle de chemin à l'aide de l'opérateur =
. La valeur d'une variable de chemin représente une liaison de chemin.
La variable p
est liée à des chemins connectant deux nodes quelconques via des edges sortants étiquetés Follows
:
MATCH p = ()-[:Follows]->()
RETURN p
Une variable de chemin ne peut être déclarée qu'une seule fois dans un modèle de graph. La requête suivante génère une erreur de syntaxe :
MATCH p = ()-[:Follows]->(), p = ()-[:Purchases]->()
RETURN p