2014-12-18 46 views
0

我想在一個可變長度的路徑上執行聚合查詢,我想聚合的節點不在原始路徑中,而是與它們相關。比如我的路徑看起來像Neo4j可變長度路徑和聚合查詢

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

但每個(:訪問)節點相關的(:目的地)

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

我想聚集是基於id屬性來算的共同路徑目的地節點不是訪問。我想出了一個辦法用一個聯盟許多固定長度的路徑與結果相結合

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的發言權,我擔心的表現使用許多聯盟。

我創建了一個Neo4j的要點在這裏與樣本數據: 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

爲您做以下工作?它將每條路徑的頭部返回爲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

沒有抱歉這個查詢沒有幫助。每個路徑中只包含第一個和最後一個目的地。另外,我並不清楚在這個問題中,我希望具有相同Destinations的路徑的數量不是單個路徑的長度。 – Shawn

+0

我相信我的查詢確實會返回路徑上的所有目的地。我使用您的示例數據對其進行了驗證,並且編輯了我的答案以顯示結果。 你是說你確實想知道每個目的地有多少路徑包含它?或者你想要別的東西嗎? – cybersam

+0

您的查詢只返回4行,其中一個長度爲7,樣本數據中最長的路徑長度爲6.我想查找路徑(任意長度)目的地路徑的次數參觀。我期望(從樣本數據)從長度爲2-6的許多路徑的結果集合,最多爲2的PathCount,這是[A,B]這是兩條樣本路徑之間唯一的公共路徑。 – Shawn