在使用 Java 的 Datastax DSE 5.0 Graph 中真的不需要 executeGraph()?

Posted

技术标签:

【中文标题】在使用 Java 的 Datastax DSE 5.0 Graph 中真的不需要 executeGraph()?【英文标题】:executeGraph() is not really needed in Datastax DSE 5.0 Graph with Java? 【发布时间】:2017-05-05 01:19:19 【问题描述】:

似乎在这两种方法中,顶点都被存储并且可以在以后正确检索。

常用配置:

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

方法一:

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

方法二:

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

【问题讨论】:

【参考方案1】:

看起来您使用的是java-dse-graph,对吗?这是一个相对较新的 API(仍处于测试阶段),它允许您使用背后的 DataStax Enterprise Java 驱动程序使用 Apache Tinkerpop 制作 Gremlin Traversals。

方法 1 的好处是,您可以确定您正在形成有效的遍历,尽管您也可以通过 statementFromTraversal 获得它(您也可以将 StringGraphStatement 传递给 executeGraph哪一点你不能确定你正在执行一个有效的遍历)。此外,您可以编写更多与供应商无关的代码,因为您使用的是 Tinkerpop API 而不是 datastax 驱动程序。好吧,您仍在使用它,但一旦您从 DseSession 获得了 GraphTraversalSource,就不会直接使用它。

方法 2 有一些方法 1 没有的好处(目前):

    如果您熟悉 datastax 驱动程序,则可以使用许多您熟悉的相同 API(ResultSetStatement 等)。 TinkerPop (TINKERPOP-1490) 的异步 API 是最近添加的,我不确定它是否适用于 java-dse-graph(还没有尝试过)。使用statementFromTraversal,您可以将生成的GraphStatement 传递给DseSession.executeAsync 进行异步操作。 DSE Graph 具有不属于 Gremlin 的架构 API。因此,您不能单独使用 TinkerPop 进行架构更改。 JAVA-1061 将使用 java-dse-graph 引入一个模式 API 来执行此操作。在此之前,您必须使用executeGraph(String|GraphStatement)。 您可以使用方法 2 执行完整的 groovy/gremlin 代码。这允许您在一次调用中执行事务管理和执行多个遍历等操作,而目前方法 1 无法执行这些操作。

我预计java-dse-graph(方法 1)将成为未来与 DSE Graph 交互的更惯用的方式。 statementFromTraversal 提供了一种两全其美的好方法(Apache TinkerPop 的优势 + DataStax java 驱动程序的接口)。

【讨论】:

感谢您的解释 :)。我试图看看是什么导致事情被提交..它似乎是方法 1 中的 .next() ..这将 GraphTraversal “转换”为 Vertex 并且它已经被存储了.. 我试图迁移我的 TitanDB 代码到 DataStax,我有很多地方要传递 Vertex,现在需要 GraphTraversals,然后才能执行Graph() Is 3) 与我的问题有关:***.com/questions/41228539/… 最重要的是两者不同,因为带有 executeGraph 的一个返回 DSE Vertex 对象,而另一个返回 Gremlin/Tinkerpop Vertex 对象(这个遗漏让我找到了***.com/q/41261845/986160 - 如果您不介意,请添加在你的完整答案中。谢谢:) 事务处理似乎也是隐式的,所以目前如果 executeGraph 不与字符串 gremlin 查询一起使用,gremlin 的流畅 api 遍历变得非常难以(如果不可能)编写,因此它们都在一个单一的交易

以上是关于在使用 Java 的 Datastax DSE 5.0 Graph 中真的不需要 executeGraph()?的主要内容,如果未能解决你的问题,请参考以下文章

DataStax OpsCenter 未在 centos dse 集群上启动

如何以简洁的方式在Datastax DSE 5.0 Graph中按顶点ID查询?

红帽 6.4 上的 Datastax Enterprise 5.0.0

麦格理银行借助DataStax Enterprise (DSE) 驱动数字化转型

在 datastax 图中使用 gremlin 访问 Solr 的最佳方法

如何在datastax中实现rdd.bulkSaveToCassandra