gpt4 book ai didi

java - 如何使用 Java 从 Gremlin 管道获取类型化的顶点

转载 作者:行者123 更新时间:2023-11-30 08:37:14 25 4
gpt4 key购买 nike

我正在使用 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]

所以我要返回城市类型的顶点。但如果我尝试这样做:

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);
}

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

我显然做错了什么,但我不知道是什么。非常欢迎任何指点!

提前致谢,琼克

最佳答案

好的,在阅读更多内容后,我找到了我自己的问题的答案。我需要“框定”从管道返回的顶点。

所以如下:

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());
}

现在我得到了我期望的输出。希望这对某人有帮助。

关于java - 如何使用 Java 从 Gremlin 管道获取类型化的顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com