traversal.asAdmin (). addStep (шаг) для удаленных вызовов - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь построить сложные обходы с помощью 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 Ответ

0 голосов
/ 05 декабря 2018

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

...