Я подключен к 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), с которыми я сталкиваюсь.