首页 > 解决方案 > 使用 Cypher 获取节点的端到端路径

问题描述

我正在尝试找到一个密码查询,该查询将为我提供变量中的端到端路径。我不希望每个路径段都作为新行。请允许我解释一下。

我的数据集主要是数以百万计的ActionsNext下一步操作有关的数据。我尝试过的是以下查询MATCH x=(:Action)-[:NEXT*]->(:Action)。这会在图表视图中给出正确的结果。但是,行结果不是我想要的。

要求的结果 假设这是我的数据集。通过上面的查询,我得到以下结果:(0->1, 1->2, 2->3, 0->1->2, 1->2->3, ...所以满足查询要求的每个可能的路径段)我想要的只是 e2e 路径,所以0->1->2->3. 对于这个数据集,它并不重要。然而,真正的数据集包含更多、更长、更多不连贯的路径。即使使用很小的数据集,此查询也会花费大量时间并且返回很多。添加到链接的每个下一步操作都会以指数方式增加返回的行数,因此查询速度非常慢。

那么问题来了,我如何才能只获得这些 e2e 结果?链接长度是可变的,开始和结束节点也是如此。这些链接通常更长,但它们在查询的早期被过滤,所以我不能只做一些事情,比如检查与它/从它没有下一个关系的链接。

我需要这个的原因是因为我继续使用这个变量,我不只是返回它。

更新:

数据库中内容的更准确版本。 数据集

现在,我可以根据日期范围、开始位置或结束位置进行过滤。例如使用以下查询

// Get the days between the specified start&end
MATCH x=(a:Day{Date:'2019-02-23'})-[:NEXT*0..]->(b:Day{Date:'2019-02-26'})
WITH [n IN NODES(x) | Id(n)] as dayIds
MATCH (startDay:Day)<-[:ON]-(startAction:Item)
MATCH (endDay:Day)<-[:ON]-(endA:Item)
WHERE Id(startDay) IN dayIds AND Id(endDay) IN dayIds
// Filter on America as end
MATCH (endAction)-[:IN]->(toNode:Place)
WHERE Id(toNode) IN [44] //Id of America
MATCH result=(startAction)-[:NEXT*]->(endAction)
RETURN result

所以我将开始和结束动作都过滤到指定范围内。然后我过滤在美国执行的最终动作。之后MATCH result=(startAction)-[:NEXT*]->(endAction) 我得到以下结果。

结果

在图形视图模式下这是正确的。但是,我返回到我的 .net 应用程序的结果如下。

结果视图

这太过分了。同样,对于这个数据集,这不是一个大问题,但我在这里谈论的是大数据。过滤后的结果将是数百万条记录。问题是我的结果在结果中有每个路径段,我只希望 e2e 路径作为 1 个结果行。

标签: neo4jcypher

解决方案


推荐阅读