executeGraph() действительно не нужен в Datastax DSE 5.0 Graph с Java?

Кажется, что в обоих подходах вершина сохраняется и может быть правильно извлечена позже.

Общая конфигурация:

DseCluster dseCluster = DseCluster.builder()
        .addContactPoint("192.168.1.43")
        .build();
DseSession dseSession = dseCluster.connect();
GraphTraversalSource g = DseGraph.traversal(
    dseSession, new GraphOptions().setGraphName("graph")
);

Подход 1:

Vertex v = g.addV("User").property("uuid","testuuid231").next();

Подход 2:

GraphStatement graphStatement =  DseGraph.statementFromTraversal(
    g.addV("User").property("uuid","testuuid231")
);
GraphResultSet grs = dseSession.executeGraph(graphStatement.setGraphName("graph"));
Vertex v = grs.one().asVertex() // as(Vertex.class) is not allowed after 1.1

person Michail Michailidis    schedule 19.12.2016    source источник


Ответы (1)


Похоже, вы используете java-dse-graph, верно? Это относительно новый API (все еще находится в стадии бета-тестирования), который позволяет вам создавать Gremlin Traversals с Apache Tinkerpop, используя Java-драйвер DataStax Enterprise под прикрытием.

Преимущество подхода 1 заключается в том, что вы можете быть уверены, что формируете действительные обходы для одного, хотя вы также получаете это через statementFromTraversal (вы также можете передать String или GraphStatement в executeGraph, и в этот момент вы не можете быть уверены, что выполняете правильный обход). Кроме того, вы можете написать код, который больше не зависит от поставщика, поскольку вы используете API Tinkerpop, а не драйвер datastax. Ну, вы все еще используете его, но не напрямую, когда у вас есть GraphTraversalSource из DseSession.

Подход 2 имеет несколько преимуществ, которых нет в подходе 1 (пока):

  1. Если вы знакомы с драйвером datastax, вы можете использовать многие из тех API, которые вам удобны (ResultSet, Statement и т. д.).
  2. Совсем недавно был добавлен асинхронный API для TinkerPop (TINKERPOP-1490). не уверен, что это сработает с java-dse-graph (еще не пробовал). Используя statementFromTraversal, вы можете передать сгенерированный GraphStatement в DseSession.executeAsync для асинхронного выполнения.
  3. DSE Graph имеет API схемы, который не является частью Gremlin. Поэтому вы не можете вносить изменения в схему только с помощью TinkerPop. JAVA-1061 представит API схемы для этого с использованием java-dse-graph. До тех пор вам придется использовать executeGraph(String|GraphStatement).
  4. Вы можете выполнять полный код groovy/gremlin с подходом 2. Это позволяет вам делать такие вещи, как управление транзакциями и выполнять несколько обходов за один вызов, чего вы в настоящее время не можете сделать с подходом 1.

Я ожидаю, что java-dse-graph (подход 1) станет более идиоматичным способом взаимодействия с DSE Graph в будущем. statementFromTraversal предлагает хороший способ получить лучшее из обоих миров (преимущество Apache TinkerPop + интерфейс для java-драйвера DataStax).

person Andy Tolbert    schedule 19.12.2016
comment
Спасибо за объяснение :). Я пытался понять, что вызывает фиксацию вещей.. и кажется, что это .next() в подходе 1.. это преобразует GraphTraversal в вершину, и она уже сохранена.. Я пытался перенести свой TitanDB код для DataStax, и у меня было много мест, где я передавал Vertex, вокруг которых теперь должны быть GraphTraversals, прежде чем они будут executeGraph()'d - person Michail Michailidis; 20.12.2016
comment
Является ли 3) связанным с моим вопросом здесь: stackoverflow.com/questions/41228539/ - person Michail Michailidis; 20.12.2016
comment
Самое главное, что они различаются, потому что один с executeGraph возвращает объекты DSE Vertex, а другой возвращает объекты Gremlin/Tinkerpop Vertex (это упущение привело меня к stackoverflow.com/q/41261845/986160 - если вы не возражаете, добавьте это в свой ответ для полноты. Спасибо :) - person Michail Michailidis; 22.12.2016
comment
Также кажется, что обработка транзакций является неявной, поэтому в настоящее время, если executeGraph не используется со строковыми запросами gremlin, становится очень сложно (если невозможно) написать плавные обходы API для gremlin, поэтому все они находятся в одной транзакции. - person Michail Michailidis; 25.12.2016