2013-06-01 16 views
9

Così ho esaminato neo4j, e potrei utilizzarlo in un prossimo progetto poiché il suo modello di dati potrebbe adattarsi molto bene al mio progetto. Ho esaminato i documenti ma ho ancora bisogno di una risposta a questa domanda:neo4j: relazioni unidirezionali/bidirezionali?

Posso impostare le relazioni in modo unidirezionale?

Sembra che alle persone di neo4j piacciano i film, quindi continuiamo con quello. Se ho un grafico come questo:

Actor A -> [:Acts in] -> Movie B 

poi direzione è evidente, poiché i nodi sono diversi tipi.

Ma mi piacciono i film horror in modo ...

Person A -> [:wants_to_kill] -> Person B 

Ho bisogno di questo rapporto per essere unidirezionale quindi se interrogo "Chi Persona A vuole uccidere?" Ottengo la Persona B, se chiedo "Chi vuole uccidere la Persona B?" Non ho niente.

A volte ho ancora bisogno relazioni per essere due direzionali

come:

Person A <-[:has_met] -> Person B 

... il che è ovvio.

documentazione dice:

Relationships are equally well traversed in either direction. This means that there is 
no need to add duplicate relationships in the opposite direction (with regard to 
traversal or performance). 

While relationships always have a direction, you can ignore the direction where it is 
not useful in your application. 

Così docs dire, i rapporti di default hanno un senso e posso ignorare che, se voglio.

Ora, questo è dove le cose si complicano:

Si consideri il seguente grafico (e notare le frecce)

Person A <- [:wants_to_kill] -> Person B 
Person B -> [:wants_to_kill] -> Person C 
Person C -> [:wants_to_kill] -> Person A 

Se ignoro le indicazioni per tutti i [:wants_to_kill] ottengo risultati falsi per "Chi fa La persona A/C vuole uccidere? " Se sapessi quali dovevo ignorare, non farei la domanda.

Quindi, in qualche modo, posso impostare le relazioni in modo bidirezionale (quando le creo) o dovrei modellare questo con due relazioni (tra Persona A & B)?

risposta

29

Una relazione in Neo4j ha sempre una direzione. Se la semantica di un tipo di relazione non include una direzione, ad es. has_met dall'esempio, quindi è consigliabile applicare una direzione arbitraria alla creazione della relazione. Interrogazione viene fatto utilizzando il "entrambe le direzioni" (non c'è "grande/piccolo di" carattere) la notazione in cifra:

start ... match (a)-[:HAS_MET]-(b) .... 

Al contrario, se la semantica di un rapporto hanno una direzione come il vostro wants_to_kill , è necessario utilizzare due relazioni per indicare che a e b vogliono uccidere l'altro e viceversa.Per l'esempio di cui sopra, è necessario disporre di 4 rapporti:

Person A -[:wants_to_kill]-> Person B 
Person B -[:wants_to_kill]-> Person A 
Person B -[:wants_to_kill]-> Person C 
Person C -[:wants_to_kill]-> Person A 

per trovare tutti la persona che A vuole uccidere lo fai:

start a=node:node_auto_index(name='A') match a-[:wants_to_kill]->victims_of_a return victims_of_a 

trovare tutte le persone che vogliono uccidere A:

start a=node:node_auto_index(name='A') match murderer_of_a-[:wants_to_kill]->a return murderer_of_a 
+0

punto in poi, grazie! – joschua011

+3

Anche dopo due anni, questo è ancora estremamente prezioso. Impossibile trovare questa risposta nella documentazione. E 'molto bene potrebbe essere in là, ma forse il modo in cui recita è reso difficile da trovare. –

Problemi correlati