1

我正在尝试返回刚刚使用 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 迁移会很痛苦。

4

2 回答 2

0

在 Datastax1.1中,您似乎无法Vertex直接转换为,文档中没有说明这一点。

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

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 手册 (1.1)

于 2016-12-21T13:34:49.957 回答
0

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

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

所以上面的代码变为:

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

wheregraph是一个GraphTraversalSource<Vertex,Vertex>对象,并且Vertex是一个org.apache.tinkerpop.gremlin.structure.Vertex对象。

于 2016-12-21T21:33:08.733 回答