【问题标题】:How to return a Vertex in the tinkerpop/gremlin format instead of the DSE graph format?如何以 tinkerpop/gremlin 格式而不是 DSE 图形格式返回顶点?
【发布时间】:2017-05-06 19:43:37
【问题描述】:

我正在尝试返回刚刚使用 Gremlin 创建的 Vertex(以 tinkerpop 格式):

DseCluster dseCluster = DseCluster.builder()
        .addContactPoint(DbC.dseHost)
        .build();
DseSession dseSession = dseCluster.connect();
GraphTraversal traversal = graph.addV(VertexLabels.User)
        .property("username", "testuser")
GraphStatement graphStatement = DseGraph.statementFromTraversal(
    traversal
);
GraphResultSet grs = dseSession.executeGraph(graphStatement.setGraphName(DbC.graphName));
Vertex v = grs.one().as(Vertex.class);

我得到了这个异常......

java.lang.ClassCastException: com.datastax.driver.dse.graph.DefaultVertex cannot be cast to org.apache.tinkerpop.gremlin.structure.Vertex

如何更改代码以使其以 gremlin.structure.Vertex 格式而不是 DSE Graph Vertex 格式返回?

我正在使用:

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>dse-driver</artifactId>
    <version>1.1.1-beta1</version>
</dependency>
<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>java-dse-graph</artifactId>
    <version>1.0.0-beta1</version>
</dependency>

我希望可以这样做,否则从 TitanDB 迁移会很痛苦..

【问题讨论】:

  • 试试.asVertex()而不是.as(Vertex.class)
  • 谢谢@ᴘᴀɴᴀʏɪᴏᴛɪs.. asVertex() 返回 dse 图 Vertex,它与 gremlin 结构 Vertex(这是标准)完全不同。
  • 我在这里询问了他们对 Fluent API 的决定:datastax-oss.atlassian.net/browse/JAVA-1250
  • 即:WARNING: please make sure that your version of Tinkerpop is compatible. The driver has been compiled and tested against version 3.2.0-incubating; it does NOT provide any compatibility guarantees for older Tinkerpop versions.

标签: java datastax datastax-enterprise-graph


【解决方案1】:

在 Datastax 1.1 中,您似乎无法直接转换为 Vertex,文档中没有说明。

您可以使用.getProperties(String) 访问VertexProperty (org.apache.tinkerpop.gremlin.structure.VertexProperty)。

GraphNode n = dseSession.executeGraph("g.V().hasLabel('test_vertex_meta_props')").one();
Vertex vertex = n.asVertex();

// there can be more than one VertexProperty with the key "meta_property"
Iterator<VertexProperty> metaProps = vertex.getProperties("meta_property");

VertexProperty metaProp1 = metaProps.next();
// the value of the meta property
int metaProp1Value = metaProp1.getValue().asInt();
// the properties of the meta property itself
Iterator<Property> simpleProps1 = metaProp1.getProperties();
Property simpleProp11 = simpleProps1.next();
double simplePropValue11 = simpleProp11.getValue().asDouble(); 
Property simpleProp12 = simpleProps1.next();
double simplePropValue12 = simpleProp12.getValue().asDouble(); 

// **multi value** meta property.
VertexProperty metaProp2 = metaProps.next();

通过:Datastax Manual (1.1)

【讨论】:

  • 那不行 .. 不幸的是 .. 按照 Gremlin 标准,我已经编写了大约 1 年的代码,等待从 TitanDB 到 DSE Graph 的顺利迁移!是的,正如我在评论中所说的那样,我看到了新的 API - 这令人沮丧:(
【解决方案2】:

根据我通过jira 和电子邮件与 Datastax 团队进行的长时间讨论:

确实有可能拥有 Fluent API 并取回纯 Gremlin/tinkerpop 对象。这是可能的,如此处 (java-dse graph 1.x documentation) 所示,直接在 GraphTraversalSource 上使用 next()、toList(),而不使用将返回 DSE 对象的 executeGraph()。

所以上面的代码变成了:

Vertex user = graph.addV("User")
                 .property("username", "testuser").next();

其中graphGraphTraversalSource&lt;Vertex,Vertex&gt; 对象,Vertexorg.apache.tinkerpop.gremlin.structure.Vertex 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2019-08-11
    相关资源
    最近更新 更多