2014-12-18 48 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