traversal.asAdmin().addStep(шаг) для удаленных вызовов
Я пытаюсь построить сложные обходы, используя Java-клиент для удаленного сервера JanusGraph.
Следующий обход возвращает элементы ReferenceVertex, обозначенные меткой "mylabel":
GraphTraversal<Vertex, Vertex> t = g.V().hasLabel("mylabel");
List<Vertex> r = t.toList();
Для более сложных запросов мне нужно объединить несколько обходов, которые составляют часть целых запросов. Следующий код иллюстрирует концепцию:
GraphTraversal<Vertex, Vertex> addMe = __.hasLabel("mylabel");
GraphTraversal<Vertex, Vertex> t = g.V();
for (Step<?, ?> step : addMe.asAdmin().getSteps()) {
t.asAdmin().addStep(step);
}
List<Vertex> r = t.toList();
Для локального доступа это работает. Однако для удаленного доступа он возвращает все вершины, доступные на сервере, а не те, которые обозначены меткой.
В обоих случаях t.toString() возвращает
[GraphStep(vertex,[]), HasStep([~label.eq(mylabel)])]
Что я делаю неправильно?
1 ответ
Я не думаю, что вам нужно входить в asAdmin()
методы. Вместо того, чтобы создавать анонимные обходы, чтобы попытаться добавить к родительскому обходу, я думаю, что было бы лучше просто обойти родитель GraphTraversal
экземпляр и просто добавьте шаги к этому по мере необходимости:
private static GraphTraversal addFilters(GraphTraversal t) {
return t.hasLabel("mylabel");
}
...
GraphTraversal<Vertex, Vertex> t = g.V();
t = addFilters(t);
List<Vertex> r = t.toList();
Есть причина, по которой ваш подход не работает с удаленными обходами и связан с тем, как байт-код Gremlin строится за кулисами. С использованием asAdmin()
методы обходят некоторые внутренние операции, и эти части обхода не отправляются на сервер - это все равно простой способ объяснить это. Если вам абсолютно необходимо создать анонимные части обхода таким образом, а затем добавить их именно таким образом, то, я думаю, я бы сделал:
GraphTraversal<Vertex, Vertex> addMe = __.hasLabel("mylabel");
GraphTraversal<Vertex, Vertex> t = g.V();
List<Vertex> r = t.filter(addMe).toList();
Мне не особенно нравится этот подход, потому что в зависимости от того, что вы делаете, вы можете обмануть стратегии обхода JanusGraph, которые оптимизируют ваши обходы, и вы потеряете некоторые оптимизации производительности. Мне также не очень нравится стиль - просто кажется более естественным обойти GraphTraversal
к функциям, которые должны мутировать его с новыми шагами. Вы также можете найти эту информацию о повторном использовании обхода полезной.