2015-12-04 5 views

Antwort

16

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

+2

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) ' –

10

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

+1

Toller Punkt, danke! –

Verwandte Themen