web-dev-qa-db-fra.com

Quelle est la différence entre plusieurs clauses MATCH et une virgule dans une requête Cypher?

Dans un langage de requête Cypher pour Neo4j, quelle est la différence entre une clause MATCH qui en suit immédiatement une autre, comme ceci:

MATCH (d:Document{document_ID:2})
MATCH (d)--(s:Sentence)
RETURN d,s

Versus les modèles séparés par des virgules dans la même clause MATCH? Par exemple.:

MATCH (d:Document{document_ID:2}),(d)--(s:Sentence)
RETURN d,s

Dans cet exemple simple, le résultat est le même. Mais y a-t-il des "pièges"?

24
Gene M

Il y a une différence: les correspondances séparées par des virgules sont en fait considérées comme faisant partie du même motif. Ainsi, par exemple, la garantie que chaque relation n’apparaît qu’une fois dans le chemin résultant est maintenue.

Les MATCH séparés sont des opérations distinctes dont les chemins ne forment pas un seul motif et qui ne possèdent pas ces garanties.

18
Michael Hunger

Il n'y a pas de différence entre cesà condition que les clauses ne soient pas liées les unes aux autres.

Si vous avez fait ceci:

MATCH (a:Thing), (b:Thing) RETURN a, b;

C'est la même chose que:

MATCH (a:Thing) MATCH (b:Thing) RETURN a, b;

Parce que (et seulement parce que) a et b sont indépendants. Si a et b étaient liés par une relation, la signification de la requête pourrait changer.

3
FrobberOfBits

Si une partie d'une requête contient plusieurs modèles déconnectés, un produit cartésien sera créé entre toutes ces parties. Cela peut générer une grande quantité de données et ralentir le traitement des requêtes. Bien que cela soit parfois prévu, il est souvent possible de reformuler la requête évitant l’utilisation de ce produit croisé, en ajoutant éventuellement une relation entre les différentes parties ou en utilisant OPTIONAL MATCH (l’identificateur est: (a)) leur est pas de différence dans cette requête mais l'a utilisé très soigneusement.

0
Akshay Vakharia