首页 文章

我们可以使用gremlin - java client将ResultSet中的Result转换为Vertex吗?

提问于
浏览
0

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

1 回答

  • 0

    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是否有适当的小细微差别 - 如果没有,那么这在技术上是一个“bug” .

相关问题