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 к функциям, которые должны мутировать его с новыми шагами. Вы также можете найти эту информацию о повторном использовании обхода полезной.

Другие вопросы по тегам