使用Cypher获取节点的端到端路径

时间:2019-02-25 16:15:50

标签: neo4j cypher

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

我的数据集主要是数以百万计的Actions,与下一个动作具有Next关系。 我尝试过的是以下查询MATCH x=(:Action)-[:NEXT*]->(:Action)。 这样可以在图形视图中给出正确的结果。但是,行结果不是我想要的。

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

那么问题是,我如何仅获得这些e2e结果? 链接长度是可变的,开始和结束节点也是可变的。这些链接通常更长,但是它们在查询中被过滤的更早,所以我不能做类似检查与它之间没有下一个关系的操作。

之所以需要它,是因为我继续使用此变量,而不仅仅是返回它。

更新:

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

现在,我可以按日期范围,开始位置或结束位置进行过滤。 例如,下面的查询

// 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) 我得到以下结果。

result

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

result view

这太过分了。同样,对于此数据集来说,这不是一个大问题,但我在这里谈论的是大数据。过滤后的结果将是数百万条记录。 问题是我的结果本身包含每个路径段,而我只想将e2e路径作为1个结果行。

0 个答案:

没有答案