如何从Neo4j中的Node M开始获得Nth级方向的完整子图

时间:2015-03-15 05:40:58

标签: java neo4j cypher

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

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

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

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

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

我也尝试在嵌入式Java API中使用TraversalDescription框架,但这并不能完全恢复所有关系。例如,下面的代码片段给了我深度为2的所有节点,但它错过了深度为2的节点之间的某些关系:

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

如果没有多次手动迭代,是否有一种简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

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

如果您想使用方向:

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)]);