Gremlin:将vetex水平作为一个呼吸第一次搜索的列表

时间:2018-05-02 00:51:41

标签: gremlin tinkerpop

我有一个图表,其中带有某些标签的边形成一个具有已定义的起点和叶顶点的树。

Tree levels diagram

我想执行广度优先搜索,并将树的每个级别的顶点作为单独的列表发出,以便进一步处理。

到目前为止,我可以使用下面的查询以正确的顺序获取顶点:

g.V()
.hasLabel("root")
.repeat(out("tree_edge").barrier().dedup())
.emit()
.until(outE("tree_edge").count().is(0))

然而,这导致一个列表:

==>v[64]
==>v[72]
==>v[80]
==>v[88]
==>v[208]
==>v[176]
==>v[216]
==>v[184]
==>v[192]
==>v[136]
==>v[152]
==>v[104]
==>v[120]
==>v[128]
==>v[144]
==>v[96]

我想要的更像是:

==>[v[64], v[72], v[80], v[88]]
==>[v[208], v[176], v[216], v[184], v[192]]
==>[v[136], v[152], v[104], v[120], v[128], v[144], v[96]]

我不确定我需要添加到重复步骤,以便它发出列表而不是单个顶点。我玩capprojectfold无济于事。

任何指针都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

根据树中的深度对顶点进行分组,然后对最终的组映射进行排序并返回所有值:

g.V().hasLabel("root").
  group("m").
    by(constant(-1)).
  repeat(out("tree_edge").dedup().group("m").by(loops())).
    until(__.not(outE("tree_edge"))).
  cap("m").
  order(local).
    by(keys).
  select(values).unfold()