2016-07-28 26 views
1

Ich habe zwei Benutzer:Neo4j Cypher Erstellen v2 Einzigartig Relation Gekennzeichnet mit Feldern ändern

CREATE (a:user {id: 1}) 
CREATE (b:user {id: 2}) 

Ich mag Benutzer in der Lage sein, sie zu folgen:

MATCH (a:user {id: 1}), (b:user {id: 2}) 
CREATE (a)-[r:FOLLOWS]->(b) 

Aber ich brauche auch den Überblick behalten wann die Folge passiert:

MATCH (a:user {id: 1}), (b:user {id: 2}) 
CREATE (a)-[r:FOLLOWS {t: 32409823}]->(b) 

Mein Problem ist, dass ich die :FOLLOWS Beziehung, wenn sie erstellen müssen existiert nicht bereits, ohne eine Abfrage zu machen, die überprüft wird, dann eine andere Abfrage, um sie zu erstellen. Idealerweise würde lösen CREATE UNIQUE diese, die ohne Ändern von Feldern auf die Beziehung funktioniert gut:

MATCH (a:user {id: 1}), (b:user {id: 2}) 
CREATE UNIQUE (a)-[r:FOLLOWS]->(b) 

(THIS WORKS) 

Aber wenn ich einen Zeitstempel auf der Beziehung sind, schaffen einzigartige eine zweite Beziehung machen, weil sie einen anderen Zeitstempel hat.

MATCH (a:user {id: 1}), (b:user {id: 2}) 
CREATE UNIQUE (a)-[r:FOLLOWS {t: 32409823}]->(b) 

(THIS DOESN'T WORK) 

Das obige erstellt eine neue Beziehung jedes Mal, weil der Zeitstempel sich ständig ändert. Gibt es eine Möglichkeit, dass ich überprüfen kann, ob eine Beziehung mit dem Label :FOLLOWS besteht und die Beziehung mit Feldern erstellen, wenn dies nicht der Fall ist?

Antwort

2

MERGE und seine ON CREATE-Klausel sollten tun, was Sie wollen. MERGE wird in der Beziehung: FOLLOWS übereinstimmen, und wenn es nicht existiert, erstellt es es. ON CREATE wird nur ausgeführt, wenn die MERGE-Operation die Beziehung erstellt hat, anstatt mit einer bestehenden übereinzustimmen.

MATCH (a:user {id: 1}), (b:user {id: 2}) 
MERGE (a)-[r:FOLLOWS]->(b) 
ON CREATE SET r.t = timestamp()