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
沒有抱歉這個查詢沒有幫助。每個路徑中只包含第一個和最後一個目的地。另外,我並不清楚在這個問題中,我希望具有相同Destinations的路徑的數量不是單個路徑的長度。 – Shawn
我相信我的查詢確實會返回路徑上的所有目的地。我使用您的示例數據對其進行了驗證,並且編輯了我的答案以顯示結果。 你是說你確實想知道每個目的地有多少路徑包含它?或者你想要別的東西嗎? – cybersam
您的查詢只返回4行,其中一個長度爲7,樣本數據中最長的路徑長度爲6.我想查找路徑(任意長度)目的地路徑的次數參觀。我期望(從樣本數據)從長度爲2-6的許多路徑的結果集合,最多爲2的PathCount,這是[A,B]這是兩條樣本路徑之間唯一的公共路徑。 – Shawn