2013-06-01 6 views
9

그래서 neo4j를 들여다 보았습니다. 데이터 모델이 내 프로젝트에 잘 어울릴 수 있기 때문에 곧 프로젝트에서 사용할 수 있습니다. 문서를 검토했지만이 질문에 대한 대답이 필요합니다.neo4j : 단방향/양방향 관계?

관계를 단방향으로 설정할 수 있습니까?

neo4j 사람들이 영화를 좋아하는 것처럼 보이므로 계속하겠습니다. 다음과 같은 그래프가있는 경우 :

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

노드가 다른 유형이므로 방향이 분명합니다.

하지만 너무 공포 영화를 좋아 ...

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

는 내가 쿼리 그래서 만약 하나의 방향으로이 관계를 필요 "누가 사람 A가 죽이고 싶어합니까?" 나는 "사람 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. 

그래서 문서 말, 기본적으로 관계가 방향을 가지고 내가 원한다면 것을 무시할 수 있습니다. 상황이 복잡 곳

지금 이것이다 : 나는에 대한 잘못된 결과 를 얻을 수있는 모든 [:wants_to_kill]의 길을 무시하면

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

다음과 같은 그래프를 고려 (그리고 화살표를주의) "누가 않습니다 사람 A/C가 죽이고 싶어? " 내가 무시해야만하는 것을 알았다면 쿼리를하지 않을 것입니다.

어떻게하면 관계를 양방향으로 만들 수 있습니까? 아니면 두 관계 (사람 A & B 사이)로 모델링해야합니까?

답변

29

Neo4j의 관계에는 항상 방향이 있습니다. 관계 유형의 의미가 방향을 포함하지 않으면 (예 : 예를 들어 has_met 인 경우 관계를 만들 때 임의의 방향을 적용하는 것이 가장 좋습니다. 관계의 의미가 wants_to_kill 같은 방향이있는 경우 이에

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

: 쿼리는 다음 "양방향"를 사용하여 수행되는 사이퍼의 표기 (아니오 "큰 /보다 작은"문자가 없다) , 당신은 a와 b가 다른 하나를 죽이고 싶어한다는 것을 가리 키기 위해 두 개의 관계를 사용할 필요가 있고 그 반대도 마찬가지입니다.

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

가 죽이고 싶어 모든 사람을 찾으려면 :

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 

은 당신이 할 죽이고 싶어 모든 사람을 찾으려면 : 위의 예를 들어, 4 개 관계를 가질 필요가

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

감사합니다. – joschua011

+3

2 년 후에도 여전히 매우 유용합니다. 문서에서이 대답을 찾을 수 없습니다. 그것은 매우 잘 거기에있을 수 있었지만 아마도 그들이 그것을 말한 방식으로 찾기가 어려웠습니다. –