2013-06-01 2 views
9

Итак, я заглянул в neo4j, и я могу использовать его в предстоящем проекте, так как его модель данных вполне может соответствовать моему проекту. Я просмотрел документы, но мне все еще нужен ответ на этот вопрос:neo4j: однонаправленные/двунаправленные отношения?

Могу ли я установить отношения однонаправленными?

Кажется, что люди neo4j любят фильмы, поэтому давайте продолжим с этим. Если у меня есть график:

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

то направление очевидно, потому что узлы разные.

Но я люблю фильмы ужасов, так что ...

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

Мне нужна эта связь, чтобы быть в одном направлении, так что если я запрашиваю «Кто Персона А хочет убить?» Я получаю Person B, если я спрашиваю: «Кто хочет, чтобы человек B хотел убить?» Я ничего не получаю.

Иногда мне еще нужны отношения, чтобы быть два Направленный

Как:

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

... это очевидно.

документация говорит:

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. 

Так документы говорят, отношения по умолчанию имеют направление, и я могу игнорировать, что, если я хочу.

Теперь это, где все становится сложнее:

Рассмотрим следующий график (и обратите внимание на стрелки)

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

Если я игнорировать направления для всех [:wants_to_kill] я получаю ложные результаты для «Кто делает Человек A/C хочет убить? " Если бы я знал, какие из них мне пришлось игнорировать, я бы не стал делать запрос.

Могу ли я каким-то образом установить отношения как двунаправленные (при их создании), или я должен моделировать это с двумя отношениями (между Person A & B)?

ответ

29

Отношения в Neo4j всегда имеют направление. Если семантика типа отношения не включает направление, например. has_met из вашего примера, тогда лучше всего применить произвольное направление к созданию отношений. Запросы затем делаются с помощью «в обоих направления» (нет «больше/меньше» символов) нотации в шифре:

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

В отличии от этого, если сделать семантику отношения имеет направление, как ваш wants_to_kill , вам нужно использовать два отношения, чтобы указать, что a и b хочет убить другого и наоборот.Для приведенного выше примера, вам нужно иметь 4 отношения:

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 

найти все лицо, что А хочет убить вас:

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

Чтобы найти всех людей, которые хотят убить:

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

точка сверху, спасибо! – joschua011

+3

Даже спустя два года это по-прежнему чрезвычайно ценно. Не удалось найти этот ответ в документах. Это очень хорошо могло быть там, но, возможно, так, как они это излагали, трудно было найти. –

Смежные вопросы