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

时间:2018-06-12 23:15:35

标签: 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 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,但我找不到快速的方法来获取起始节点下的所有内容。

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

1 个答案:

答案 0 :(得分:1)

我的查询中有一件事我不明白。 为什么要这样做(n2)-[*0..]->(n3)-[r4]->(n5)而不仅仅是(n2)-[*0..]->(n5)

此外,我在路径的最后一个节点上看不到任何约束。通常这个节点是一个叶子,所以最好像这样表达它:

MATCH p=(root)-[*]->(leaf)
WHERE NOT (leaf)-->()
RETURN p

使用这种查询,您只搜索根和叶子之间的所有路径。它比搜索树中的所有路径要快得多。

更深层次,如果你想要最好的表现,你应该使用图表遍历。使用apoc.path.expand程序查看APOC:https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_expand_paths