Невозможно перейти к вершинам с уникальными свойствами в Гремлин - PullRequest
0 голосов
/ 08 февраля 2019

Я ищу пути для перехода из одной вершины в другую, избегая вершин со свойствами, уже сопоставленными с этим путем.

Рассмотрим этот пример:

    Graph graph = TinkerGraph.open();

    GraphTraversalSource t = graph.traversal();

    Vertex A = t.addV().property("age", 19).next();
    Vertex B = t.addV().property("age", 21).next();
    Vertex C = t.addV().property("age", 20).next();
    Vertex D = t.addV().property("age", 21).next();
    Vertex E = t.addV().property("age", 22).next();

    t.V(A).addE("knows").to(B).iterate();
    t.V(B).addE("knows").to(C).iterate();
    t.V(C).addE("knows").to(D).iterate();
    t.V(D).addE("knows").to(E).iterate();
    t.V(C).addE("knows").to(E).iterate();

    List<Path> paths = t.V(A)
            .repeat(
                    out()
            ).times(5).emit()
            .has("age", 22).path().toList();

    Assert.assertEquals(1, paths.size());

Я ищу пути от А до Е. Есть два пути:

А-> В-> С-> D-> E A-> B-> C-> E

Я ищу только второй вариант, потому что на первом пути B и D имеют одинаковый возраст.

Я попытался отфильтровать, используя as и by, но мне не удалось масштабировать это по всему пути.Например, я могу проверить вершины, чтобы они не соответствовали свойству первой вершины, выполнив следующее:

    List<Path> paths = t.V(A).as("first")
            .repeat(
                    out()
                    .where(P.neq("first")).by("age")
            ).times(5).emit()
            .has("age", 22).path().toList();

    Assert.assertEquals(1, paths.size());

Но, как вы можете себе представить, он не фильтрует столкновения в середине пути,Я чувствую, что должен быть более простой способ сделать это, что я скучаю.Есть оператор вроде as (), но вместо замены предыдущего присваивания он сохраняет их в массиве или что-то в этом роде?Как мне этого добиться?

Спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

Вам нужно сравнить текущее значение age с all ранее замеченным age с.Если есть совпадение, пусть траверсер умрет:

t.V(A).as("a").
  repeat(filter(loops().is(lt(5))).out().
         not(values("age").as("current").         /* current age   */
               select(all, "a").unfold().         /* previous ages */
               values("age").
                 where(eq("current"))).as("a")).  /* not() negates the match */
    until(has("age", 22)).
  path()
...