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