簡體   English   中英

Titan gremlin控制台和Java為group()。by()查詢返回不同的結果

[英]Titan gremlin console and java returns different result for group().by() query

我正在使用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,6776295608 = 1,7030726848 = 1,35401920 = 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 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]

您可以構建使用TinkerPop 3.1.1 titan11分支 ,也可以嘗試JanusGraph

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM