Как вернуть вершину в формате tinkerpop/gremlin вместо формата графика DSE?

Я пытаюсь вернуть Vertex (в формате tinkerpop), который был только что создан с помощью Gremlin:

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 будет болезненной.


person Michail Michailidis    schedule 21.12.2016    source источник
comment
Попробуйте .asVertex() вместо .as(Vertex.class)   -  person ᴘᴀɴᴀʏɪᴏᴛɪs    schedule 21.12.2016
comment
Спасибо @ᴘᴀɴᴀʏɪᴏᴛɪs.. asVertex() возвращает вершину графа dse, которая полностью отличается от вершины структуры гремлина (которая является стандартной).   -  person Michail Michailidis    schedule 21.12.2016
comment
Я спросил, каково их решение относительно Fluent API здесь: datastax-oss.atlassian.net /browse/JAVA-1250   -  person Michail Michailidis    schedule 21.12.2016
comment
Соответствуете ли вы требованиям, указанным в: docs.datastax.com/en/developer/java-driver-dse/1.0/manual/graph/   -  person ᴘᴀɴᴀʏɪᴏᴛɪs    schedule 21.12.2016
comment
А именно: 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.   -  person ᴘᴀɴᴀʏɪᴏᴛɪs    schedule 21.12.2016
comment
@ᴘᴀɴᴀʏɪᴏᴛɪs позвольте мне проверить - может быть, титан приносит старую версию Гремлина   -  person Michail Michailidis    schedule 21.12.2016
comment
@ᴘᴀɴᴀʏɪᴏᴛɪs Я удалил все зависимости Titan и получаю ту же ошибку. Когда я пытаюсь добавить версию 3.2.0-инкубацию гремлина в свой помпон, я получаю ClassNotDefExceptions и т. д..   -  person Michail Michailidis    schedule 21.12.2016
comment
@PANAYIOTIS, по-видимому, 1.1, который я использую, обрабатывает вещи по-разному:/ docs.datastax.com/en/developer/java-driver-dse/1.1/manual/graph/   -  person Michail Michailidis    schedule 21.12.2016


Ответы (2)


В Datastax 1.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)

person ᴘᴀɴᴀʏɪᴏᴛɪs    schedule 21.12.2016
comment
Это не сработает... к сожалению... это не по стандартам Gremlin, так как я кодировал около 1 года, ожидая плавного перехода с TitanDB на DSE Graph! Да, я видел новый API, как я сказал в своем комментарии - это расстраивает :( - person Michail Michailidis; 21.12.2016

Согласно длительному обсуждению с командой Datastax через jira и электронные письма:

Действительно возможно иметь Fluent API и возвращать чистые объекты Gremlin/tinkerpop. Это возможно, как показано здесь (java -dse graph 1.x документация) с использованием next(), toList() непосредственно для GraphTraversalSource и без использования executeGraph(), который возвращает объекты DSE.

Таким образом, приведенный выше код изменяется на:

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

где graph — объект GraphTraversalSource<Vertex,Vertex>, а Vertex — объект org.apache.tinkerpop.gremlin.structure.Vertex.

person Michail Michailidis    schedule 21.12.2016