【问题标题】:Can we convert Result in ResultSet to Vertex by using gremlin - java client?我们可以使用 gremlin - java 客户端将 ResultSet 中的 Result 转换为 Vertex 吗?
【发布时间】:2018-09-13 05:47:02
【问题描述】:

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

【问题讨论】:

  • 谢谢。但这无济于事,我想要一个 gremlin 查询,它可以在最后给我一个顶点列表,我可以将它转换为 tinkerpop 顶点或其他方式。

标签: java graph azure-cosmosdb gremlin tinkerpop3


【解决方案1】:

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 是否正确涵盖了这些细微差别 - 如果没有,那么从技术上讲,这就是一个“错误”。

【讨论】:

    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多