我将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
答案 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());
}
现在我收回了我期待的输出。希望这有助于某人。