Есть ли способ создать два итератора с гермлиновым индексом на одну позицию вперед? - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь программно добавить ребра на график.

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

Хотя проблема заключается в сжатии. Я не могу сделать это, чтобы сжать два потока, с одним потоком, продвинутым на одну позицию вперед.

(
    g.V().hasLabel("person").
    order().by("age")
    .as("x")
    .local(
        union(
            select("x"),
            select("x") // .skip(1)
        ).fold()
    )
)

==>[v[2],v[2]]
==>[v[1],v[1]]
==>[v[4],v[4]]
==>[v[6],v[6]]

Выше работает. Но когда я раскомментирую часть skip, я получаю

==>[v[2]]
==>[v[1]]
==>[v[4]]
==>[v[6]]

, но мне нужно:

==>[v[2],v[1]]
==>[v[1],v[4]]
==>[v[4],v[6]]

Я прилагаю следующую часть для справки.

(
    g.V().hasLabel("person").
    order().by("age")
    .as("x")
    .local(
        union(
            select("x"),
            select("x")
        ).fold()
    ).sideEffect(
        project("first", "second")
            .by(unfold().limit(1))
            .by(unfold().skip(1))
        .coalesce(
            select("first").out("age_lt").unfold(),
            choose(
                math("second - first").by("age").is(lt(5)),
                addE("age_lt").from(select("first")).to(select("second"))
            )
        )
    ).none()
)

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Это даст вам пары последовательных вершин:

g.V().hasLabel("person").order().by("age").store("x").local(
    select(all,"x").tail(local, 2)
).skip(1)

Обратите внимание на пропуск в конце, чтобы отфильтровать первую "пару" одной вершины.

0 голосов
/ 06 ноября 2019

Вы можете сделать это с помощью шаблона разбиения, который имеет такую ​​форму (где «2» - размер вашего раздела):

g.V().fold().
  emit().
  until(__.not(__.unfold())).
  repeat(__.skip(local, 2)).
  filter(__.unfold()).
  limit(local, 2)

, но вместо пропуска «2» внутри repeat(), который вы простопропустите «1», так как вы хотите продвинуть вперед траверс только на «1», таким образом:

gremlin> g.V().hasLabel("person").
......1>   order().by("age").fold().
......2>   emit().
......3>   until(__.not(__.unfold())).
......4>   repeat(__.skip(local,1)).
......5>   filter(__.unfold()).
......6>   limit(local,2)
==>[v[2],v[1]]
==>[v[1],v[4]]
==>[v[4],v[6]]
==>[v[6]]

Затем просто избавьтесь от любых непарных элементов:

gremlin> g.V().hasLabel("person").
......1>   order().by("age").fold().
......2>   emit().
......3>   until(__.not(__.unfold())).
......4>   repeat(__.skip(local,1)).
......5>   filter(__.unfold()).
......6>   limit(local,2).
......7>   filter(count(local).is(2))
==>[v[2],v[1]]
==>[v[1],v[4]]
==>[v[4],v[6]]
...