我问了这个问题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";
}
如果没有多次手动迭代,是否有一种简单的方法可以做到这一点?
答案 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)]);