2013-06-01 22 views
9

Also habe ich neo4j angeschaut, und ich könnte es in einem kommenden Projekt verwenden, da sein Datenmodell sehr gut zu meinem Projekt passt. Ich schaute durch die Dokumente, aber ich brauche immer noch eine Antwort auf diese Frage:neo4j: eindirektionale/bidirektionale Beziehungen?

Kann ich Beziehungen zu einseitig gerichtet sein?

Es scheint, dass die Neo4j Leute mögen Filme, also lass uns damit fortfahren. Wenn ich ein Diagramm wie folgt habe:

dann ist die Richtung offensichtlich, weil die Knoten verschiedene Typen sind.

Aber Ich mag Horrorfilme so ...

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

Ich brauche diese Beziehung in eine Richtung zu sein, so dass, wenn ich frage: „Wer hat Person A töten will?“ Ich bekomme Person B, wenn ich frage "Wer will Person B töten?" Ich bekomme nichts.

Manchmal brauche ich Beziehungen noch zwei Richtungs

Wie zu sein:

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

... was offensichtlich ist.

Dokumentation sagt:

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. 

So docs sagen, Beziehungen standardmäßig eine Richtung haben, und ich kann das ignorieren, wenn ich will.

Nun ist dies, wo die Dinge kompliziert werden:

Betrachten Sie die folgende Grafik (und beachten Sie die Pfeile)

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

Wenn ich die Wegbeschreibung ignorieren für alle [:wants_to_kill] ich falsche Ergebnisse für „Wer bekommen hat Person A/C will töten? " Wenn ich wüsste, welche ich ignorieren musste, würde ich die Abfrage nicht machen.

Also kann ich Beziehungen irgendwie bidirektional einstellen (wenn ich sie erstelle), oder sollte ich das mit zwei Beziehungen modellieren (zwischen Person A & B)?

Antwort

29

Eine Beziehung in Neo4j hat immer eine Richtung. Wenn die Semantik eines Beziehungstyps keine Richtung enthält, z. has_met aus Ihrem Beispiel, dann empfiehlt es sich, beim Erstellen der Beziehung eine beliebige Richtung anzuwenden. Querying wird dann unter Verwendung der „beiden Richtungen“ getan (es gibt keine „größer/kleiner als“ Zeichen) Notation in Chiffre:

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

Im Gegensatz dazu, wenn die Semantik einer Beziehung habe eine Richtung wie Ihre wants_to_kill , müssen Sie zwei Beziehungen verwenden, um anzuzeigen, dass a und b den anderen töten möchten und umgekehrt.Für das obige Beispiel, müssen Sie 4 Beziehungen haben:

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 

alle, die Person zu finden, die eine töten wollen Sie tun:

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

alle Personen zu finden, die eine töten wollen:

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

spot auf, danke! – joschua011

+3

Auch nach zwei Jahren ist das immer noch sehr wertvoll. Diese Antwort wurde in den Dokumenten nicht gefunden. Es könnte sehr gut drin sein, aber vielleicht machte es die Art, wie sie es formulierten, schwierig es zu finden. –

Verwandte Themen