2012-07-06 4 views
17

In Cypher in Neo4J, bei zwei Knoten, wenn es keine Beziehung zwischen ihnen gibt, möchte ich eine Beziehung (vom Typ Foo) mit einer Gewichtungseigenschaft von eins erstellen. Wenn diese Beziehung bereits besteht, möchte ich ihre Gewichtseigenschaft erhöhen.In Cypher, wie kann ich eine Beziehung erstellen, wenn sie nicht existiert; Update-Eigenschaft, wenn es tut

Gibt es eine gute Möglichkeit, dies in einer einzigen Cypher-Abfrage zu tun? Vielen Dank!

Bearbeiten: Einige zusätzliche Details: Die Knoten sind bereits erstellt, eindeutig und in einem Index.

+0

Bist du in Ordnung mit einem Snapshot-Version von Neo4j verwenden? In neo4j 1.8 können Sie das Diagramm mit Cypher aktualisieren, aber nicht in anderen Versionen. – Nicholas

+0

Ja, ich benutze den SNAPSHOT. – Newtang

+0

Also im Wesentlichen Sie suchen alle Knoten zu scannen und wenn verbunden, erhöhen, wenn nicht, Beziehung erstellen? – Nicholas

Antwort

44

Dies ist genau, warum wir CREATE UNIQUE in 1.8 hinzugefügt haben.

START a=node(...), b=node(...) 
CREATE UNIQUE a-[r:CONNECTED_TO]-b 
SET r.weight = coalesce(r.weight?, 0) + 1 

Lesen Sie mehr über CREATE UNIQUEhere, das Fragezeichen here und here verschmelzen.

+0

Perfekt! Genau das, wonach ich gesucht habe. Ich wusste von RELATIVE, aber nicht von der Verschmelzungsphrase. Was genau macht das "?" machen? – Newtang

+0

Bearbeitet die Antwort auf das Handbuch zu zeigen – Andres

+4

Seit Neo4j 2.0 der? Bediener wurde entfernt. Siehe: http://neo4j.com/docs/snapshot/query-operators.html#query-operators-comparison –

10

Zur Vervollständigung Andres Antwort, Fragezeichen am Ende einer Immobilie ist nun ein Fehler mit Neo4j 2. So Anfrage wird:

MATCH a, b 
WHERE a(...) AND b(...) 
CREATE UNIQUE a-[r:CONNECTED_TO]->b 
SET r.weight = coalesce(r.weight, 0) + 1