Гремлин: выбросить уровни vetex в виде списка с первого дыхания - PullRequest
0 голосов
/ 02 мая 2018

У меня есть график, где ребра с определенными метками образуют дерево с определенными начальными и конечными вершинами.

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

Я не уверен, что мне нужно добавить к шагу повторения, чтобы он выдавал список вместо отдельных вершин. Я играл с cap, project и fold безрезультатно.

Любые указатели приветствуются.

1 Ответ

0 голосов
/ 02 мая 2018

Группируйте вершины по их глубине в дереве, затем сортируйте окончательную карту группы и возвращайте все значения:

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()
...