2014-10-11 6 views
1

neo4j를 배우려고하고 있는데 나무 꼭대기가 아닌 한 직원이 관리자가있는 기본 직원/고용주 예제부터 시작하려고합니다.neo4j에서 노드와 트리 맨 사이의 노드를 반환하는 방법

내 구조는 employee-> MANAGEDBY-> manager-> MANAGEDBY-> manager-> MANAGEDBY-> manager처럼 보입니다. 그러나 각 관리자는 여러 명의 직원 또는 관리자를 둘 수 있습니다.

내가 할 수 있기를 원하는 것은 직원과 주 보스 (CEO/사장/기타) 간의 모든 관리자 목록을 얻는 것입니다.

처음에 나는이 그렇게 내 매니저와 그/그녀의 매니저와 보여뿐만 아니라 것이

MATCH(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*0..]-(managers) 
    RETURN managers.Name; 

같은 쿼리 진형 그러나 또한 내가 원하는 때 자신이 관리하는 모든 사람을 보여주는 것 같다 표시하는 것은

Josh, 
Boss, 
BossBoss, 
BossBossBoss, 
CEO 
약간의 검색 후

내가 다음 쿼리

MATCH p=(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*0..]-(managers) 
WHERE NOT(managers-[:MANAGEDBY]->()) 
RETURN p; 
를 사용하여 가까이 관리 약간의 행운이 같은 목록입니다

저는 neo4j를 배우기 때문에 여기서 일어나는 일에 대해 가장 잘 추측합니다. 제 자신이 MANAGEDBY 관계가없는 첫 번째 관리자에게로가는 길이라는 것입니다. 내 문제는 이것이 경로를 반환하고 나는 단지 관리자 목록을 선호하는 것입니다.

p = 쿼리를 수행하지 않고도이 작업을 수행 할 수 있습니까?

답변

2

경로 검색어에이라는 관계 방향의 방향을 추가해야합니다! 그렇지 않으면 Josh에서 아래쪽으로 탐색하십시오.

그리고에서 varlength 쿼리를 시작하면 Josh도 반환됩니다. 기본값은 1..이므로이 값을 그대로 둘 수 있습니다.

nodes(p)으로 경로의 노드를 반환 할 수 있습니다.

MATCH p=(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*]->(managers) 
WHERE NOT(managers-[:MANAGEDBY]->()) 
RETURN nodes(p); 

당신은 당신이 두 가지 중 하나를 수행 할 수 노드 당 하나 개의 행을 원한다면 : 어느 행에 다시 컬렉션을 긴장.

MATCH p=(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*]->(managers) 
WHERE NOT(managers-[:MANAGEDBY]->()) 
UNWIND nodes(p) as n 
RETURN n; 

또는 각 경로의 마지막 노드를 루트까지 되돌립니다.

MATCH p=(baseEmployee {Name: 'Josh'})-[:MANAGEDBY*]->(managers) 
RETURN managers; 
+0

나는 당신이 관계의 방향을 지정할 수 있다는 것을 몰랐습니다. 나는 MATCH (baseEmployee {Name : 'Josh'})와 같은 것으로 생각한다. - [: MANAGEDBY * 0 ..] -> (managers) RETURN managers.Name; 그것이 내게서 나무의 가장 높은 층으로 가면서 나무의 부모만을 포함하는 것처럼 보이고 절대로 아래를지나 다니는 것처럼 나의 필요를 완벽하게 충족시킨다. – Josh

관련 문제