2015-09-23 7 views
17

In einer Cypher Abfragesprache für Neo4j, was ist der Unterschied zwischen einer MATCH-Klausel unmittelbar nach einem anderen wie folgt aus:Was ist der Unterschied zwischen mehreren MATCH-Klauseln und einem Komma in einer Cypher-Abfrage?

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

Versus die durch Kommata getrennte Muster in der gleichen MATCH-Klausel? Zum Beispiel:

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

In diesem einfachen Beispiel ist das Ergebnis das gleiche. Aber gibt es irgendwelche "gotchas"?

Antwort

2

Es gibt keine Unterschiede zwischen diesen vorausgesetzt, dass die Klauseln nicht miteinander verbunden sind.

Wenn Sie dies tun:

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

Das ist das gleiche wie:

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

Weil (und nur da) a und b unabhängig sind. Wenn a und b durch eine Beziehung verknüpft sind, könnte sich die Bedeutung der Abfrage ändern.

13

Es gibt einen Unterschied: Komma getrennte Übereinstimmungen werden tatsächlich als Teil desselben Musters betrachtet. So wird zum Beispiel die Garantie, dass jede Beziehung nur einmal im resultierenden Pfad erscheint, aufrechterhalten.

Separate MATCHes sind separate Operationen, deren Pfade keine einzelnen Muster bilden und die diese Garantien nicht haben.

1

Wenn ein Teil einer Abfrage mehrere nicht verbundene Muster enthält, wird ein kartesisches Produkt zwischen all diesen Teilen erstellt. Dies kann zu einer großen Datenmenge führen und die Abfrageverarbeitung verlangsamen. Während gelegentlich beabsichtigt, kann es oft möglich sein, die Abfrage neu zu formulieren, die die Verwendung dieses Kreuzprodukts vermeidet, möglicherweise durch Hinzufügen einer Beziehung zwischen den verschiedenen Teilen oder durch Verwenden von OPTIONAL MATCH (Identifikator ist: (a)). Kurz gesagt ist es kein Unterschied in dieser beiden Abfrage aber sehr vorsichtig verwendet.

Verwandte Themen