我正在使用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,6776295608,7030726848,
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、6772295608 = 1,
7030726848 = 1,35401920 = 1}}]]
最佳答案
请参阅此处给出的答案https://stackoverflow.com/a/43284707/5025129iterate()
得到零结果next()
得到一个结果toList()
得到很多结果
您应该调用toList()
而不是next()
。
这也是对结果迭代http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#result-iteration的很好阅读
编辑:TinkerPop 3.0.x中似乎与此有关的一个错误,并且可以在Gremlin Console中重现,但在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]
您可以build the
titan11
branch使用TinkerPop 3.1.1,也可以尝试JanusGraph。关于java - Titan gremlin控制台和Java为group()。by()查询返回不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43823806/