Neo4j 获取指定起始节点下所有节点的最快方法

Neo4j 获取指定起始节点下所有节点的最快方法,neo4j,directed-graph,Neo4j,Directed Graph,我有一个查询已经运行了一段时间,但随着我的图表的增长,它的速度严重减慢: MATCH p1=(n2)-[*0..]->(n3)-[r4]->(n5) WHERE (id(n2) = 123456 // Fill in starting node ID AND all(r6 in relationships(p1) WHERE (NOT exists(r6.value1) OR r6.value1 = r6.value2) // Add some constraints on th

我有一个查询已经运行了一段时间,但随着我的图表的增长,它的速度严重减慢:

MATCH p1=(n2)-[*0..]->(n3)-[r4]->(n5)
WHERE (id(n2) = 123456 // Fill in starting node ID
  AND all(r6 in relationships(p1) WHERE (NOT exists(r6.value1) OR r6.value1 = r6.value2) // Add some constraints on the path
  ))

RETURN id(n3),n3.constr,r4.constr,type(r4),id(n5),n5.constr,n5.value // Things about n3,r4,n5, n3 may be the starting node
不幸的是,在我的起始节点下有各种各样的节点标签和关系,我想返回关于它们的信息,所以我不能在这些部分上进一步约束我的查询。我可以快速获取起始节点,因为我有它的ID,但是我找不到一种快速的方法来获取起始节点下的所有内容


问同样的问题,但除了添加标签约束之外,没有任何真正的答案,我不能这样做。因为我知道我有一个树结构(并且希望所有节点都在一个起始节点下),有没有更快的方法来执行这个查询?这是我应该在Traversal API中写的东西吗(如果是,那会是什么样子)?

在您的查询中有一件事我不明白。 你为什么要做这件事而不仅仅是这件事

此外,我在路径的最后一个节点上没有看到任何约束。通常,此节点是一个叶,因此最好将其表示为:

MATCH p=(root)-[*]->(leaf)
WHERE NOT (leaf)-->()
RETURN p
使用这种查询,您只需搜索根和叶之间的所有路径。它比搜索树中的所有路径要快得多


要更深入一层,如果想要获得最佳性能,应该使用图遍历。使用APOC.path查看APOC。展开过程:

关于第一个问题,我需要返回路径边缘编码的信息。你不能再做一个可变长度的路径并给它命名了,所以这是我能想到的最好的解决方法。它还对前面的可变长度进行编码,因此您定义的每个
(叶)
都不能保证是叶。这将为树中的每一步返回一行。不,但可以在路径=>
last(rels(p1))
的rels或节点上迭代。在快速捕获路径
p
后,是否可以对其应用我的第一个模式?就像我不知道的那样,只需给出完整的查询,我们将看到编辑成原始问题