Повтор остановки Gremlin 3 на указанной глубине (java)

Мне нужен запрос, который перемещается вниз по определенному типу ребра, пока не достигнет вершины с заданным свойством ИЛИ не достигнет заданного расстояния от начальной вершины.

Я могу остановить этот обход, когда он достигает определенного типа вершины, но я не могу остановить его на заданной глубине/расстоянии. Должно быть что-то не так с тем, как я использую шаги «simplePath» и «count», но я не уверен, что это такое.

Вот код Java:

GraphTraversal<Vertex, TinkerGraph> traversal = g.V(start)
    .repeat(__.outE("type").subgraph("subGraph").inV())
    .until(
            __.or(
                //this line works just fine
                __.has("type", "one"),   
                //this line doesn't seem to do what I expect,
                //stop when the size of the path from "start" gets too long
                __.simplePath().count().is(P.gt(3))
            )
    )
    .cap("subGraph");

Итак, что мне нужно сделать, чтобы этот обход прекратился, когда размер пути от «стартовой» вершины до текущей вершины больше 3?


person Brenden    schedule 14.01.2016    source источник


Ответы (1)


Если вы используете последнюю версию, вы можете сделать это:

g.V(start).repeat(...)
          .until(has("type", "one").or().loops().is(gt(3)))
          .cap("subGraph")

Примеры:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).repeat(both().simplePath()).until(has("name","peter").or().loops().is(1)).path().by("name")
==>[marko, lop]
==>[marko, vadas]
==>[marko, josh]
gremlin> g.V(1).repeat(both().simplePath()).until(has("name","peter").or().loops().is(2)).path().by("name")
==>[marko, lop, josh]
==>[marko, lop, peter]
==>[marko, josh, ripple]
==>[marko, josh, lop]
gremlin> g.V(1).repeat(both().simplePath()).until(has("name","peter").or().loops().is(3)).path().by("name")
==>[marko, lop, peter]
==>[marko, lop, josh, ripple]
==>[marko, josh, lop, peter]
person Daniel Kuppitz    schedule 16.01.2016