如何使用Java从Gremlin管道中获取类型化的Vertex

时间:2016-05-21 22:27:35

标签: java orientdb gremlin

我将OrientDB 2.2.0与TinkerPop 2.6.0和Java 8一起使用。

我有一个示例图表,其设置如下: 城市--- LOCATED_IN --->国家。

City和Country都实现了com.tinkerpop.frames.VertexFrame。

如果我创建了一个FramedGraph,我可以非常轻松地查询特定的国家/地区并获取一个类型化的Iterable,例如:

Iterable<Country> countries = framedGraph.getVertices("countryCode", "NL", Country.class);

这很有效。

现在我想要实现相同类型的东西,然后使用Gremlin,这样我就可以做更复杂的查询。因此,作为一个简单的测试,我想测试一下,看看我是否可以使用Gremlin获取前一个语句所提供的国家城市。

Vertex nl = countries.iterator().next().asVertex();

GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<>();

pipe.start(nl).inE("LOCATED_IN").outV();

for (Vertex v : pipe) {
    System.out.println(v.getProperty("name").toString());
}

现在这个工作,我得到以下输出:

Nijmegen
Nieuw-Vennep
Niewegein
Sittard
Sittard
Noordwijk
Lisse

我想要实现的是从管道中取回City对象而不是Vertex对象(与FramedGraph查询一样)。

管道似乎正在返回正确的类型,因为如果我稍微改变代码:

Vertex nl = countries.iterator().next().asVertex();

GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<>();

pipe.start(nl).inE("LOCATED_IN").outV();

for (Vertex v : pipe) {
    System.out.println(v);
}

我回来了:

v(City)[#38:3]
v(City)[#40:3]
v(City)[#37:3]
v(City)[#36:3]
v(City)[#33:4]
v(City)[#35:3]
v(City)[#39:3]

所以我回到了City类型的顶点。 但如果我尝试这样做:

Vertex nl = countries.iterator().next().asVertex();

GremlinPipeline<Vertex, City> pipe = new GremlinPipeline<>();

pipe.start(nl).inE("LOCATED_IN").outV();

for (City v : pipe) {
    System.out.println(v);
}

我明白了:

java.lang.ClassCastException: com.tinkerpop.blueprints.impls.orient.OrientVertex cannot be cast to models.City

如果我试试这个:

Vertex nl = countries.iterator().next().asVertex();

GremlinPipeline<Vertex, City> pipe = new GremlinPipeline<>();

pipe.start(nl).inE("LOCATED_IN").outV().cast(City.class);

for (City v : pipe) {
    System.out.println(v);
}

我得到了相同的类强制转换异常。

我显然做错了什么,但我无法弄明白什么。任何指针都非常受欢迎!

提前致谢,Jonck

1 个答案:

答案 0 :(得分:2)

好的,经过阅读后,我找到了自己问题的答案。我需要&#34;框架&#34;我从管道回来的顶点。

如下:

Vertex nl = countries.iterator().next().asVertex();

GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<>();

pipe.start(nl).inE("LOCATED_IN").outV();

Iterable<City> cities = framedGraph.frameVertices(pipe, City.class);

for (City city : cities) {
    System.out.println(city.getName());
}

现在我收回了我期待的输出。希望这有助于某人。