Ein Mitarbeiter codiert etwas wie folgt aus:Was bewirkt ein Komma in einer Cypher-Abfrage?
match (a)-[r]->(b), (c) set c.x=y
Was macht das Komma? Ist es nur eine Abkürzung für MATCH?
Ein Mitarbeiter codiert etwas wie folgt aus:Was bewirkt ein Komma in einer Cypher-Abfrage?
match (a)-[r]->(b), (c) set c.x=y
Was macht das Komma? Ist es nur eine Abkürzung für MATCH?
Da Cyphers ASCII-Art-Syntax nur eine lineare Kette von Verbindungen in einer Zeile angeben kann, ist das Komma zumindest teilweise vorhanden, damit Sie Dinge angeben können, die abzweigen könnten. Zum Beispiel:.
MATCH (a)-->(b)<--(c), (b)-->(d)
Das drei Knoten darstellt, die alle auf b
(zwei eingehenden Beziehungen verbunden sind, und eine abgehende Beziehung
Das Komma kann auch nützlich sein für die Trennlinien, wenn Ihr Spiel zu lang wird, so wie:
MATCH
(a)-->(b)<--(c),
(c)-->(d)
Offensichtlich ist das nicht eine sehr lange Linie, aber das ist äquivalent zu:
MATCH
(a)-->(b)<--(c)-->(d)
Aber im Allgemeinen gibt jede MATCH
Anweisung ein Muster an, nach dem Sie suchen möchten. Alle Teile dieses MATCH
bilden das Muster. In Ihrem Fall suchen Sie eigentlich nach zwei unverbundenen Mustern (und (c)
) und so findet Neo4j jede Kombination jeder Instanz beider Muster, was möglicherweise sehr teuer sein könnte. In Neo4j 2.3 erhalten Sie wahrscheinlich auch eine Warnung, dass es sich um eine Abfrage handelt, die Ihnen ein kartesisches Produkt liefert.
Wenn Sie jedoch mehrere Übereinstimmungen angeben, werden Sie nach verschiedenen Mustern suchen. Also wenn du es tatest:
MATCH (a)-[r]->(b)
MATCH (c)
Konzeptionell denke ich, es ist ein bisschen anders, aber das Ergebnis ist das gleiche. Ich weiß, dass es mit OPTIONAL MATCH
definitiv anders ist. Wenn ja:
MATCH (a:Foo)
OPTIONAL MATCH (a)-->(b:Bar), (a)-->(c:Baz)
würden Sie nur Instanzen finden, wo es ein Foo
Knoten mit nichts verbunden ist, oder mit sowohl einem Bar
und einem Baz
Knoten. Während, wenn Sie dies tun:
MATCH (a:Foo)
OPTIONAL MATCH (a)-->(b:Bar)
OPTIONAL MATCH (a)-->(c:Baz)
Sie werden jeden einzelnen Foo
Knoten finden, und Sie werden null oder mehr Bar
und Baz
Knoten unabhängig verbunden übereinstimmen.
EDIT:
In den Kommentaren Stefan Armbruster einen guten Punkt gemacht, die Kommas auch verwendet werden können Unter-Patterns auf einzelne Kennungen zuzuweisen. Wie in:
MATCH path1=(a)-[:REL1]->(b), path2=(b)<-[:REL2*..10]-(c)
Danke Stefan!
EDIT2: Siehe auch Mats' Antwort unten
Brian macht einen guter Job zu erklären, wie das Komma verwendet werden kann, größere Subgraphen Muster zu konstruieren, aber es gibt auch einen feinen, aber wichtigen Unterschied zwischen dem Komma und eine zweite MATCH
Klausel.
Betrachten Sie die einfache Grafik von zwei Knoten mit einer Beziehung zwischen ihnen. Die Abfrage
MATCH()-->() MATCH()-->() RETURN 1
wird wieder eine Zeile mit der Nummer 1. Setzen Sie die zweite MATCH
mit einem Komma, aber, und keine Zeilen werden überhaupt zurückgegeben werden:
MATCH()-->(),()-->() RETURN 1
Dies wegen der Vorstellung ist, von Beziehung Eindeutigkeit. Innerhalb jeder MATCH
Klausel wird jede Beziehung nur einmal durchlaufen. Das bedeutet, dass für meine zweite Abfrage die eine Beziehung im Diagramm dem ersten Muster entspricht und dass das zweite Muster nichts zuordnen kann, was dazu führt, dass das gesamte Muster nicht übereinstimmt. Meine erste Abfrage wird die eine Beziehung einmal in jeder der Klauseln übereinstimmen und somit eine Zeile für das Ergebnis erstellen.
Lesen Sie mehr hierzu in dem Neo4j Handbuch: http://neo4j.com/docs/stable/cypherdoc-uniqueness.html
Toller Punkt, danke! –
zu Brians Antwort zu ändern: anderer Anwendungsfall für das Komma in Übereinstimmung vorhanden ist Subpattern individuelle Kennungen zuweisen, beispielsweise MATCH path1 = (a) - [: REL1] -> (b), path2 = (b) <- [: REL2 * .. 10] - (c) ' –