Каков наилучший подход из 2, представленных ниже, для проверки узла и ребра гремлина? - PullRequest
0 голосов
/ 06 июня 2019

Я подключен к gremlin server (версия 3.4.0) из моего Java-приложения, используя gremlin-driver (версия 3.4.0).Я использую следующий код для подключения к серверу из Java.

Cluster cluster = Cluster.build("localhost").port(8182).create();
Client client = cluster.connect();
GraphTraversalSource graphTraversalSource = AnonymousTraversalSource.traversal()
    .withRemote(DriverRemoteConnection.using(client, "g"));

// To get the list of vertices
List<Vertex> vertices = graphTraversalSource.V().toList();

//To add a vertex
GraphTraversal newNode = graphTraversalSource.addV("Label 1");

//To add properties to the vertex
newNode.property("key1","value1");
newNode.property("key2",1002);

Теперь у меня есть требование, чтобы у каждой вершины были некоторые предопределенные, но динамические свойства, такие как name, uuid и т. Д. Эти предопределенные свойстваможет варьироваться от вершины к вершине (на основе метки вершины) и может измениться в будущем;следовательно, динамический.Из-за этой динамики я не могу использовать предопределенную схему Гремлина.

Теперь я думаю, что у меня есть два варианта, как его реализовать.

Approach 1. Я могу сохранить логику проверки в своем Java-приложении и перейти к gremlin, только если она действительна.

Approach 2. Я могу реализовать некоторую стратегию обхода, такую ​​как EventStrategy

Первый вариант - прямой, и там нет ракетостроения.Что касается второго варианта, я сталкиваюсь со следующими проблемами:

Issue 1. Я не могу найти никаких ссылок, где они реализовали remote и strategy оба с тем же GraphTraversalSource.

Issue 2. Как остановить создание Vertex, если произошел сбой проверки.

Я попробовал следующее для реализации remote и strategy с одним и тем же GraphTraversalSource, но это выдает ошибку сериализации.

// Here GremlinMutationListener is a class which implements MutationListener

MutationListener mutationListener = new GremlinMutationListener();
EventStrategy eventStrategy = EventStrategy.build().addListener(mutationListener).create();
GraphTraversalSource graphTraversalSource = AnonymousTraversalSource.traversal()
    .withRemote(DriverRemoteConnection.using(client, "g"))
    .withStrategies(eventStrategy);

ошибка, которую я получаю:

Caused by: java.lang.IllegalArgumentException: Class is not registered: org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy
Note: To register this class use: kryo.register(org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy.class);

Также в MutationListener я не могу найти способ остановить выполнение и вернуть ошибку проверки, кроме выдачи исключения;у которых может быть много накладных расходов

public class GremlinMutationListener implements MutationListener {
    private static final Logger LOGGER =
            LoggerFactory.getLogger(GremlinMutationListener.class);

    @Override
    public void vertexAdded(Vertex vertex) {
        LOGGER.info("SS: vertexAdded " + StringFactory.vertexString(vertex));
        // How can I return the validation error from here besides throwing exception?
        // Is there some other interface which I should implement?
    }

    .
    .
    .
    .

Теперь вопрос в том, что является лучшим подходом здесь 1 или 2, учитывая производительность.И если это 2, как решить проблемы (1 и 2), с которыми я сталкиваюсь.

1 Ответ

0 голосов
/ 06 июня 2019

EventStrategy не очень хороший способ проверки. Вы не получите уведомление о событии, пока изменения в базовом графике уже произошли, поэтому ошибка проверки наступит слишком поздно.

Я действительно думаю, что TraversalStrategy может быть изящным способом реализовать проверку. Я думаю, что вы бы:

  1. Реализуйте свой собственный ValidationTraversalStrategy для поиска любых шагов мутации, а затем проверьте их содержимое на наличие "неверных данных", выдавая исключение в случае возникновения проблемы. Поскольку применение стратегии происходит до итерации обхода, вы должны остановить обход до того, как оно внесет изменения в базовый граф.
  2. Сконфигурируйте «g» в Gremlin Server для использования на стороне сервера настройки стратегии, чтобы все подключения к нему автоматически получали выгоду от этой стратегии.

Недостатком здесь является то, что не все графы поддерживают возможность включения пользовательских стратегий обхода, поэтому вы должны быть в порядке с уменьшенной переносимостью кода, используя этот подход.

Другой подход, который является более переносимым (и, возможно, более простым), заключается в создании Gremlin DSL . Таким образом, вы можете реализовать свою проверку на стороне клиента прямо во время построения обхода. Например, вы можете добавить шаг вроде:

public default GraphTraversal<S, Vertex> person(String personId, String name) {
    if (null == personId || personId.isEmpty()) throw new IllegalArgumentException("The personId must not be null or empty");
    if (null == name || name.isEmpty()) throw new IllegalArgumentException("The name of the person must not be null or empty");

    return coalesce(__.V().has(VERTEX_PERSON, KEY_PERSON_ID, personId),
                    __.addV(VERTEX_PERSON).property(KEY_PERSON_ID, personId)).
            property(KEY_NAME, name);
}

Этот пример взят из репозитория KillrVideo - вы можете найти там больше вдохновения, а также рассмотреть связанные посты в блоге, связанные с этим репо:

  1. https://www.datastax.com/dev/blog/gremlin-dsls-in-java-with-dse-graph
  2. https://academy.datastax.com/content/gremlin-dsls-python-dse-graph
  3. https://academy.datastax.com/content/gremlin-dsls-net-dse-graph

Несмотря на то, что в этих сообщениях блога используются разные языки программирования, содержание каждого сообщения применимо к любому, кто использует Gremlin на любом языке.

...