Я ищу пути для перехода из одной вершины в другую, избегая вершин со свойствами, уже сопоставленными с этим путем.
Рассмотрим этот пример:
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 (), но вместо замены предыдущего присваивания он сохраняет их в массиве или что-то в этом роде?Как мне этого добиться?
Спасибо