2012-07-06 5 views
17

In Cypher in Neo4J, dati due nodi, se non c'è alcuna relazione tra di loro, mi piacerebbe creare una relazione (di tipo Foo) con una proprietà weight di uno. Se questa relazione esiste già, vorrei incrementare la sua proprietà di peso.In Cypher, come posso creare una relazione se non esiste; aggiorna la proprietà se lo fa

C'è un buon modo per farlo in una singola query di Cypher? Grazie!

Modifica: alcuni dettagli aggiuntivi: I nodi sono già creati, univoci e in un indice.

+0

Stai bene con l'utilizzo di una versione un'istantanea di Neo4j? In neo4j 1.8 puoi aggiornare il grafico usando Cypher, ma non in altre versioni. – Nicholas

+0

Sì, sto usando lo SNAPSHOT. – Newtang

+0

Quindi, in sostanza, stai cercando di eseguire la scansione di tutti i nodi e se connesso, incrementare, se non, creare una relazione? – Nicholas

risposta

44

Questo è esattamente il motivo per cui abbiamo aggiunto CREATE UNIQUE in 1.8.

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

Leggi di più su CREATE UNIQUEhere, il punto interrogativo here e coagularsi here.

+0

Perfetto! Proprio quello che stavo cercando. Sapevo di RELATE, ma non la frase di coalesce. Cosa fa esattamente il "?" fare? – Newtang

+0

Modificata la risposta al manuale – Andres

+4

Dal momento che Neo4j 2.0 è il? l'operatore è stato rimosso. Vedi: http://neo4j.com/docs/snapshot/query-operators.html#query-operators-comparison –

10

Per completare Andres risposta, un punto interrogativo alla fine di una proprietà è ora un errore con Neo4j 2. richiesta Così sarà:

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