如何使用 Java 从 Gremlin 管道获取类型化顶点
How to get typed Vertex from Gremlin pipeline using Java
我正在使用 OrientDB 2.2.0 以及 TinkerPop 2.6.0 和 Java 8.
我有一个示例图,设置如下:
城市 ---LOCATED_IN---> 国家。
城市和国家都实施 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]
所以我得到了城市类型的顶点。
但如果我尝试这样做:
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);
}
我得到了相同的 class 转换异常。
我显然做错了什么,但我不知道是什么。非常欢迎任何指点!
提前致谢,琼克
好的,在阅读更多内容后,我找到了自己问题的答案。我需要 "frame" 从管道返回的顶点。
所以如下:
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());
}
现在我得到了我期望的输出。希望这对某人有所帮助。
我正在使用 OrientDB 2.2.0 以及 TinkerPop 2.6.0 和 Java 8.
我有一个示例图,设置如下: 城市 ---LOCATED_IN---> 国家。
城市和国家都实施 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]
所以我得到了城市类型的顶点。 但如果我尝试这样做:
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);
}
我得到了相同的 class 转换异常。
我显然做错了什么,但我不知道是什么。非常欢迎任何指点!
提前致谢,琼克
好的,在阅读更多内容后,我找到了自己问题的答案。我需要 "frame" 从管道返回的顶点。
所以如下:
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());
}
现在我得到了我期望的输出。希望这对某人有所帮助。