2014-12-18 2 views
0

집계하려는 노드가 원래 경로에 있지 않고 대신에 관련된 가변 길이 경로에서 집계 쿼리를 수행하려고합니다. 예를 들어 내 경로Neo4j 가변 길이 경로 및 집계 쿼리

MATCH p = (:Visit)-[:NEXT*]->(:Visit) 
RETURN p 

처럼 보이지만 각 내가 원하는 집계는 ID 속성을 기반으로 공통의 경로를 계산하는 것입니다

(:Visit)-[:LOCATION]->(:Destination) 

: (대상) (방문) 노드는 관련이 방문수가 아니라 대상 노드의 나는 많은 고정 된 길이 경로를 결합하는 조합을 사용하는 방법 결과

MATCH (d1:Destination)--(v1:Visit), (d2:Destination)--(v2:Visit) 
WHERE (v1:Visit)-[:NEXT]->(v2:Visit) 
RETURN [d1.id,d2.id] AS Path, count(*) AS PathCount 
UNION 
MATCH (d1:Destination)--(v1:Visit), (d2:Destination)--(v2:Visit), (d3:Destination)--(v3:Visit) 
WHERE (v1:Visit)-[:NEXT]->(v2:Visit)-[:NEXT]->(v3:Visit) 
RETURN [d1.id,d2.id,d3.id] AS Path, count(*) AS PathCount 
UNION ... 

을 생각하지만 경로가 길이 (200)의 말 경우이 아주 좋은 해결책이 아니다, 나는의 성능에 대한 걱정 많은 노동 조합을 사용. http://gist.neo4j.org/?a8ab894c5c9740a94747

샘플 데이터

CREATE 
// Destinations. 
(d1:Destination {id:'A'}), 
(d2:Destination {id:'B'}), 
(d3:Destination {id:'C'}), 
(d4:Destination {id:'D'}), 
(d5:Destination {id:'E'}), 
(d6:Destination {id:'F'}), 
// First Route 
(v1:Visit {time:1}), 
(v2:Visit {time:2}), 
(v3:Visit {time:3}), 
(v4:Visit {time:4}), 
(v5:Visit {time:5}), 
(v1)-[:LOCATION]->(d1), 
(v2)-[:LOCATION]->(d2), 
(v3)-[:LOCATION]->(d3), 
(v4)-[:LOCATION]->(d4), 
(v5)-[:LOCATION]->(d6), 
(v1)-[:NEXT]->(v2)-[:NEXT]->(v3)-[:NEXT]->(v4)-[:NEXT]->(v5), 
// Second Route 
(v6:Visit {time:10}), 
(v7:Visit {time:21}), 
(v8:Visit {time:23}), 
(v10:Visit {time:45}), 
(v6)-[:LOCATION]->(d1), 
(v7)-[:LOCATION]->(d2), 
(v8)-[:LOCATION]->(d4), 
(v9)-[:LOCATION]->(d6), 
(v10)-[:LOCATION]->(d5), 
(v11)-[:LOCATION]->(d3), 
(v6)-[:NEXT]->(v7)-[:NEXT]->(v8)-[:NEXT]->(v9)-[:NEXT]->(v10)-[:NEXT]->(v11); 

예상 출력

Path PathCount 
[A, B] 2 
[D, F] 1 
[B, D] 1 
[B, C] 1 
[C, D] 1 
[B, C, D] 1 
[C, D, F] 1 
[A, B, C] 1 
[A, B, D] 1 
... many more 

답변

0

합니까 당신을 위해 다음과 같은 작업 :

나는 샘플 데이터로 여기 Neo4j 요점을 만들었습니다? 각 경로의 머리 부분을 PathHead, 경로에있는 다른 모든 노드의 정렬 된 컬렉션을 PathTail, 경로의 단계 수를 PathCount으로 반환합니다.

MATCH (d1:Destination)<-[:LOCATION]-(v1:Visit)-[:NEXT*]->(:Visit)-[:LOCATION]->(d2:Destination) 
RETURN d1.id as PathHead, COLLECT(d2.id) AS PathTail, COUNT(*) AS PathCount 
+0

이 검색어는 도움이되지 않습니다. 첫 번째 목적지와 마지막 목적지 만 각 경로에 포함됩니다. 또한 질문에 명확하지 않았습니다. 동일한 대상을 가진 경로의 수를 단일 경로의 길이가 아닌 원하는 것으로 계산했습니다. – Shawn

+0

내 쿼리가 경로의 모든 대상을 반환한다고 생각합니다. 샘플 데이터로 확인한 결과를 보여주기 위해 내 대답을 편집했습니다. 실제로 각 대상에 대해 얼마나 많은 경로가 포함되어 있는지 알고 싶습니까? 아니면 다른 것을 원하니? – cybersam

+0

귀하의 쿼리는 4 행만 반환하며, 그 중 하나는 길이가 7입니다. 샘플 데이터의 가장 긴 경로는 길이가 6입니다. 대상의 경로 (길이에 관계없이)가 얼마나 많은지 계산하고 싶습니다. 방문했다. 2 개의 샘플 경로 사이의 유일한 공통 경로 인 [A, B]의 PathCount가 2 인 길이 2-6의 결과 집합을 (샘플 데이터에서) 기대합니다. – Shawn