我的查询已经工作了一段时间,但随着我的图表的增长已经严重放缓:
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中编写的内容(如果是这样,那会是什么样的)?
答案 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