2013-06-01 16 views
9

Więc zajrzałem do neo4j i mogę go używać w nadchodzącym projekcie, ponieważ jego model danych może bardzo dobrze pasować do mojego projektu. Przejrzałem dokumentację, ale nadal potrzebuję odpowiedzi na to pytanie:neo4j: relacje jednokierunkowe/dwukierunkowe?

Czy mogę ustawić relacje na jednokierunkowe?

Wygląda na to, że ludzie z neo4j lubią filmy, więc kontynuujmy to. Jeżeli muszę wykres tak:

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

czym kierunek jest oczywista, ponieważ węzły są różne typy.

Ale lubię horrory więc ...

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

muszę ten związek będzie jednokierunkowy więc jeśli zapytanie „Kto ma Osoba A chce zabić?” Dostaję osobę B, jeśli zapytam "Kto chce, aby osoba B chce zabić?" Nic nie dostaję.

Czasami nadal muszę relacje być dwukierunkowe

odczuwalna:

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

... co jest oczywiste.

dokumentacja mówi:

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. 

Więc docs powiedzieć, relacje domyślnie mają kierunek i mogę ignorować faktu, że jeśli chcę.

Teraz to jest, gdy sprawy się komplikują:

Rozważmy następujący wykres (i zwróć uwagę na strzałki)

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

Gdybym ignoruje wskazówki dla wszystkich [:wants_to_kill] dostaję fałszywe wyniki dla „Kto robi Osoba A/C chce zabić? " Gdybym wiedział, które z nich musiałem zignorować, nie zadałbym pytania.

Czy mogę w jakiś sposób ustawić relacje na dwukierunkowe (podczas ich tworzenia), czy też powinienem modelować to z dwiema relacjami (między osobą A & B)?

Odpowiedz

29

Relacja w Neo4j zawsze ma kierunek. Jeśli semantyka typu relacji nie uwzględnia kierunku, np. has_met ze swojego przykładu, najlepiej zastosować arbitralny kierunek podczas tworzenia relacji. Zapytania Następnie odbywa się za pomocą przycisków „w obu kierunkach” (nie ma „większy/mniejszy niż” znak) notacja w Cypher:

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

Natomiast jeśli semantyka relacji mają kierunek jak twój wants_to_kill , musisz użyć dwóch relacji, aby wskazać, że aib chcą zabić drugiego i odwrotnie.Na powyższym przykładzie, trzeba mieć 4 relacje:

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 

znaleźć wszystkie osoby, które A chce zabić zrobić:

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

Aby znaleźć wszystkie osoby, które chcą zabić A:

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

miejsce na, dzięki! – joschua011

+3

Nawet po dwóch latach nadal jest to niezwykle cenne. Nie można znaleźć tej odpowiedzi w dokumentach. Mogło tam być bardzo dobrze, ale być może sposób, w jaki je sformułowali, utrudniał znalezienie. –