2012-10-01 5 views
0

특정 인물을 알고있는 이웃과의 대화 지속 시간 비율을 결정하고 싶습니다. 예를 들어예기치 않은 neo4j Cypher 쿼리 결과

노드 A를 관찰 첫째 우리는 그가 다음 쿼리를 실행 이웃의 모든 통화에 소비 얼마나 많은 시간을 알고있다 : 우리가 확인해야

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b) return sum(r.duration) 
==> +-----------------+ 
==> | sum(r.duration) | 
==> +-----------------+ 
==> | 12418   | 
==> +-----------------+ 
==> 1 row, 0 ms 

다음 자신의 이웃하는 B가 알고있는 특정 사람 (C 말한다)과 합계 단지는 A 사이에 대화의 지속와 b를 알고 C :

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b)-[p:KNOWS]->(c) return sum(r.duration) 
==> +-----------------+ 
==> | sum(r.duration) | 
==> +-----------------+ 
==> | 21013   | 
==> +-----------------+ 
==> 1 row, 0 ms 

무슨 논리적 보이지 않는 것은 두 번째 합계가 두 번째 반면 첫 번째보다 큰 것입니다 하나는 정당한 것으로되어있다. 첫 번째 부분. 누구든지 그러한 결과를 얻는데 문제가 될 수 있다는 것을 알고 있습니까? 오류는 15000 명 중 7 명의 사용자에게 나타났습니다.

답변

2

해당 검색어에서 특정 사용자 C가 없습니다. 당신은 모든 경로를 any : KNOWS 관계에 매치하고 있으므로 a-> b-> c와 a-> b-> d 사이에 a-> b 사이의 기간은 두 번 계산됩니다.

은 당신이 아마해야 할 것은이 대신이다

start a = node(351061), c=node(xxxxx) // set c explicitly 
match (a)-[r:TALKED_TO]->(b) 
where b-[:KNOWS]->c // putting this in the where clause forces you to set C 
return sum(r.duration) 

다음은 콘솔의 예입니다 : http://console.neo4j.org/r/irm0zy

match 넓혀 where 결과를 냈다 것을 기억하십시오. match으로이 작업을 수행 할 수도 있지만 start에 c를 지정해야합니다.

집계 함수가 수행중인 작업을 테스트하는 좋은 방법은 명명 된 변수를 모두 반환하거나 반환 할 수있는 경로를 설정하는 것입니다. 이렇게하면 집계가 부분합으로 구분됩니다. 좋아요 :

start a=node(1) 
match a-[r:TALKED_TO]->b-[:KNOWS]->c 
return sum(r.duration), a,b,c; 
+-----------------------------------------------------------------------------------------------+ 
| sum(r.duration) | a      | b      | c      | 
+-----------------------------------------------------------------------------------------------+ 
| 20    | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[4]{name:"person4"} | 
| 20    | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[3]{name:"person3"} | 
| 20    | Node[1]{name:"person1"} | Node[5]{name:"person5"} | Node[6]{name:"person6"} | 
+-----------------------------------------------------------------------------------------------+