2012-10-04 4 views
1

노드 A가 노드 B에서 시작하는 Cypher 쿼리의 일부인 노드 A에 연결된 노드 수를 계산하려고하는데 예기치 않은 결과가 나타납니다. 다음은 설정 예입니다. 우리가 책과 소유자보고있는 척, 물론 자신의 책의 소유자 동안 책은 다른 책을 인용 :Neo4j 집계/연결된 노드 수

Book B1 
Book B2 CITES B1 
Book B3 CITES B1 
Book B4 
Owner O1 OWNS B1 
Owner O2 OWNS B2 
Owner O3 OWNS B3 and B4 

이 그래서 내가 책 B1 찾고 있어요 가정 해 봅시다, 내가 그것을 인용 각 책을 찾으려면 그 다음 인용 도서를 소유 한 각 개인이 소유 한 책을 세십시오. 따라서 B1로 시작하면 각자 B1을 인용 한 책을 소유하고 있으므로 소유자 O2와 O3을 찾아야합니다. 내가 소유 한 책을 세면 O2는 1, O3는 2가되어야합니다.

그래서 첫째, 단지 소유자를 나열하는 쿼리는 잘 작동 : 예상대로 이름을 반환

start a=node(1) MATCH a<-[:CITES]-b<-[:OWNS]-c return c.name 

합니다. 그러나이 쿼리는 : 그것은 소유자의 목록입니다 C에 도착한다 것처럼

start a=node(1) MATCH a<-[:CITES]-b<-[:OWNS]-c-[:OWNS]->d return c.name, count(d) 

그것은, 다음은 D로 소유 책의 관계를 소유 통과, 그들을 계산 보인다. 하지만 그 대신 내가 얻을 :

+--------------------+ 
| c.name | count(d) | 
+--------------------+ 
| "O3" | 1  | 
+--------------------+ 

이 책을 이미 다른 링크 소유를 통해 발견 된/노드 밖으로 떠나는 것처럼 느낀다 - B로 표현되는 것들. 하나의 쿼리에서이 작업을 수행 할 수있는 방법이 있습니까? 아니면 소유자를 C로 모으고 각각에 대해 다시 쿼리하는 것이 가장 좋습니까? 이것이 가능해야한다고 생각하지만, 아직 이해하지 못했습니다. 어떤 아이디어라도 좋을 것입니다 - 미리 감사드립니다.

답변

0

맞아요. 일단 노드가 발견되면 다른 이름의 변수로 동일한 일치 항목에서 다시 찾을 수 없습니다. WITH을 사용하여 이것을 깨뜨린 다음 동일한 방법으로 d을 사용하면 모두 일치합니다.

START a=node(14) 
MATCH a<-[:CITES]-b<-[:OWNS]-c 
WITH c MATCH c-[:OWNS]->d 
RETURN c.name, count(d); 
많은 이해

http://console.neo4j.org/?id=x1jst9

+0

, 정말 고마워! 그래도 여전히 문제가 발생합니다. 쿼리를 시도하면 WITH 문에 표시기와 함께 "SyntaxException : expected return clause"오류가 발생합니다. neo4j 커뮤니티 서버 1.7을 실행 중이므로 상당히 새롭지 만 사이퍼 파서 버전 문제 일 수 있습니까? 다시 한번 감사드립니다. – Masonoise

+0

나는 내 자신의 질문에 대답했다. 실제로 서버를 1.8 버전으로 업그레이드해야하는데 이제는 완벽하게 작동합니다. 다시 한 번 감사드립니다! – Masonoise

+0

당신이 그것을 알아 낸 것을 기쁘게 생각합니다. :) –

관련 문제