2016-01-14 5 views
1

Мне нужен запрос, который пересекает вниз по определенному типу края до тех пор, пока он не достигнет вершины с заданным свойством ИЛИ не достигнет заданного расстояния от начальной вершины.Gremlin 3 stop repeat на указанной глубине (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?

ответ

4

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

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] 

 Смежные вопросы

  • Нет связанных вопросов^_^