如何在 Neo4j 中从节点 M 开始获得第 N 级方向的完整子图

How to get complete subgraph with direction at Nth level starting at Node M in Neo4j

我不久前问过这个问题 How to get subgraph 并发现虽然它确实给了我第 N 级的所有节点和关系,但答案假设关系的方向从起始节点散开或收敛到节点。我正在寻找的是一个完整的子图,它捕获特定级别的所有关系和节点,同时保留和关联关系的方向。

例如,如果我想要深度为 2 的所有节点和关系,我可以按如下方式进行无方向查询:

START n=node(12345) MATCH (n)<-[r*1..2]->(m) RETURN r, m;

这很有效,因为我获得了所有节点和所有关系,但我发现我不知道关系的方向。

如果我将搜索深度限制为 1 并执行两次搜索,一次进入,一次离开,我可以通过这种方式获得所有节点和关系的方向。然后我可以递归地对在深度二找到的所有节点执行相同的查询,从一开始就丢弃包含在第二层之外找不到的节点的任何关系。这看起来相当痛苦和手动,但它有效。

我也尝试过在嵌入式 Java API 中使用 TraversalDescription 框架,但这并不完全是 return 所有关系。例如,以下代码片段为我提供了深度为 2 的所有节点,但它遗漏了深度为 2 的节点之间的一些关系:

for ( Path position : graphDb.traversalDescription() .breadthFirst() .evaluator( Evaluators.toDepth( 2 ) ) .traverse( templateNode ) ) { output += position + "\n"; }

有没有无需多次手动迭代即可轻松完成此操作的方法?

无方向查询没有箭头提示。

如果你想有一个方向使用:

START n=node(12345)
 MATCH (n)-[r*1..2]->(m)
 RETURN r, m;

您可以访问 rel 的开始和结束节点,然后输出它们以推断它们的方向。

START n=node(12345)
 MATCH (n)-[rels*1..2]->(m)
 RETURN m, extract(r in rels | [startNode(r),endNode(r),type(r)]);