neo4j - 使用 Cypher 获取节点的端到端路径
问题描述
我正在尝试找到一个密码查询,该查询将为我提供变量中的端到端路径。我不希望每个路径段都作为新行。请允许我解释一下。
我的数据集主要是数以百万计的Actions
与Next
下一步操作有关的数据。我尝试过的是以下查询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 个结果行。
解决方案
推荐阅读
- npm - 当我运行 npm install gulp-sass 时出现此错误?
- typescript - TypeError:无法读取未定义的属性“实例”
- python - 代码运行器图标未显示在 Visual Studio 代码中
- javascript - 如何将 uuid 值传递给使用 JavaScript 动态添加的表单的所有输入字段?
- css - Bootstrap 插件破坏了我的 CSS
- c++ - Xcode 总是重建
- java - 使用 EmailConnector (Wso2 Integration Studio) 检索的二进制附件出现问题
- html - 当我将嵌入式 CSS 转换为内联 CSS 时,媒体查询不会覆盖其类
- extjs - Ext js 7 现代折叠/调整面板
- html - 文本对齐:中心不会应用于图像后的链接