我们可以使用 gremlin - java 客户端将结果集中的结果转换为顶点吗?



我正在使用Github示例来生成图形(https://github.com/Azure-Samples/azure-cosmos-db-graph-java-getting-started(。现在我想查询它,并将一个顶点实例拿在手中,根据用户在知识图谱中的进一步输入进一步遍历。

提交此 gremlin 查询:g.V().hasLabel('schedule').inE().outV().hasLabel('url').as('a').dedup() .where(and(out().hasLabel('schedule').has('name','3'),out() .hasLabel('states').has('name', 'federal'))).select('a')

// Submitting remote query to the server.
ResultSet results = client.submit(query);
CompletableFuture<List<Result>> completableFutureResults = results.all();
List<Result> resultList = completableFutureResults.get();
for (Result result : resultList) {
System.out.println("My vertex--"+result.getVertex());
System.out.println("nQuery result:");
System.out.println("resultssssss-"+result.toString());
}

我该怎么做,因为现在我收到一个类转换异常,如下所述:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.apache.tinkerpop.gremlin.structure.Vertex
at org.apache.tinkerpop.gremlin.driver.Result.getVertex(Result.java:131)
at GetStarted.Dynamic.main(Dynamic.java:155)
select('a')

对我来说似乎是多余的 - 我认为可以删除。它选择的输出已经是where()的当前输出,该输出已经是"a"处的顶点,这意味着您的遍历应该是:

g.V().hasLabel('schedule').
in().hasLabel('url').
dedup().
where(and(out().hasLabel('schedule').has('name','3'),
out().hasLabel('states').has('name', 'federal')))

我想进一步的优化是在and()之前进行out(),这样你只遍历这些边一次:

g.V().hasLabel('schedule').
in().hasLabel('url').
dedup().
where(out().and(has('schedule','name','3'),
has('states', 'name', 'federal')))

现在。。。返回一个Vertex,但是,您拥有的也应该返回一个Vertex。至少根据 TinkerPop 规范,在对单个标签进行select()时,您应该返回单个对象。但是,如果您执行多个标签,则会得到一个Map。你可以在这里看到TinkerGraph演示了这一点:

gremlin> g.V().hasLabel('person').as('a').out().as('b').select('a')
==>v[1]
==>v[1]
==>v[1]
==>v[4]
==>v[4]
==>v[6]
gremlin> g.V().hasLabel('person').as('a').out().as('b').select('a','b')
==>[a:v[1],b:v[3]]
==>[a:v[1],b:v[2]]
==>[a:v[1],b:v[4]]
==>[a:v[4],b:v[5]]
==>[a:v[4],b:v[3]]
==>[a:v[6],b:v[3]]

这让我想知道 CosmosDB 是否正确涵盖了这个细微差别 - 如果没有,那么这在技术上是一个"错误"。

最新更新