【问题标题】:Titan gremlin console and java returns different result for group().by() queryTitan gremlin 控制台和 java 为 group().by() 查询返回不同的结果
【发布时间】:2017-10-05 01:10:18
【问题描述】:

我使用 cassandra 2.1.7 支持的 Titan 1.0.0 作为后端存储。在尝试在 gremlin 控制台和 java 程序上执行相同的查询时,我得到 2 两种不同格式的输出。我正在使用由 titan-1.0.0-hadoop1 提供的 gremlin 控制台,对于 java,我正在使用 TinkerPop Gremlin 3.0.1-incubating

Gremlin 控制台:

gremlin> g.V().has('msid',within(-2128958273, 2147477890)).as('in').local(outE('hie_child').has('hostid_e',within(153,83)).order().by('hrank',incr).limit(5)).group().by(outV().id()).by(inV().id().fold())

==>[77467688:[1531850904, 4742561976, 1009049792, 1010020408, 1053356264], 73363640:[2060075072, 3698942184, 67767295608, 7038 35401920]]

我得到了预期的输出类型,即Map<VertexId, List<VertexId>>

但是在 java 程序中执行相同的查询时,我得到了Map<VertexId, BulkSet>BulkSet 包括一个计数器,指示特定条目在结果集中添加的次数。有人可以告诉我是否有办法在 java 中获得与 gremlin 控制台类似的结果。

Java:

List<Map<Object, Object>> list = g.V().has("msid", P.within(-2128958273,2147477890)).as("in").local(__.outE("hie_child").has("hostid_e", P.within(153,83)).order().by("hrank", Order.incr).limit(5)).group().by(__.outV().id()).by(__.inV().id().fold()).fold().next();

System.out.println(list);

[{77467688={1531850904=1, 4742561976=1, 1009049792=1, 1010020408=1, 1053356264=1}, 73363640={2060075072=1, 3698942184=1, 6776295608=1, 7030726848=1, 35401920=1}}]

【问题讨论】:

    标签: java titan gremlin tinkerpop3


    【解决方案1】:

    查看这里给出的答案https://stackoverflow.com/a/43284707/5025129

    • iterate() 得到零结果
    • next()得到一个结果
    • toList() 得到很多结果

    您应该致电toList() 而不是next()

    这也是结果迭代的好读物http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#result-iteration

    编辑:TinkerPop 3.0.x 中似乎存在与此相关的错误,并且可以在 Gremlin 控制台中重现,但在 TinkerPop 3.1.x 中已修复。实际上,您应该能够很好地使用BulkSet,因为它只包含值。您看到的是 BulkSet.toString()ArrayList.toString() 的区别。

    TinkerPop 3.0.x

    gremlin> graph = TinkerFactory.createModern()
    ==>tinkergraph[vertices:6 edges:6]
    gremlin> g = graph.traversal()
    ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
    gremlin>  l = g.V(1).local( outE('knows') ).group().by( __.outV().id() ).by( __.inV().id().fold() ).fold().next()
    ==>[1:[2, 4]]
    gremlin> l[0].getClass()
    ==>class org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep$GroupMap
    gremlin> l[0].values().iterator().next().getClass()
    ==>class org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet
    gremlin> bs = l[0].values().iterator().next()
    ==>2
    ==>4
    gremlin> bs[0].getClass()
    ==>class java.lang.Integer
    gremlin> bs[1].getClass()
    ==>class java.lang.Integer
    gremlin> bs.toString()
    ==>{2=1, 4=1}
    

    TinkerPop 3.1.x

    gremlin> graph = TinkerFactory.createModern()
    ==>tinkergraph[vertices:6 edges:6]
    gremlin> g = graph.traversal()
    ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
    gremlin>  l = g.V(1).local( outE('knows') ).group().by( __.outV().id() ).by( __.inV().id().fold() ).fold().next()
    ==>[1:[2, 4]]
    gremlin> l[0].getClass()
    ==>class java.util.HashMap
    gremlin>  l[0].values().iterator().next().getClass()
    ==>class java.util.ArrayList
    gremlin> bs = l[0].values().iterator().next()
    ==>2
    ==>4
    gremlin> bs[0].getClass()
    ==>class java.lang.Integer
    gremlin> bs[1].getClass()
    ==>class java.lang.Integer
    gremlin> bs.toString()
    ==>[2, 4]
    

    您可以使用使用 TinkerPop 3.1.1 的 build the titan11 branch,也可以尝试使用 JanusGraph

    【讨论】:

    • 感谢您的回答,但这对我没有帮助。我面临的问题是,Java 中返回的 Map 值包含针对每个值的计数,即 {77467688={1531850904=1, 4742561976=1, 1009049792=1, 1010020408=1, 1053356264=1},而我只对 gremlin 控制台 [77467688:[1531850904, 4742561976, 1009049792, 1010020408, 1053356264] 返回的值感兴趣。
    • 这似乎是一个错误,所以我对我的答案进行了编辑。
    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多