TinkerPop在遍历时没有得到正确的计数类型。

问题描述 投票:0回答:1

我想检索特定范围的用户(分页所需),同时也想检索总计数,我正在执行下面的查询,它按照预期的方式检索用户顶点列表,但总计数却返回为 BulkSet

Map<String, Object> result = gt.V().hasLabel("user").sideEffect(__.count().store("total"))
    .order().by("name", Order.desc)
    .range(0, 10).fold().as("list")
    .select("list","total").next();

输出结果如下

enter image description here

如何获得正确的计数作为 Long 值,而不是 BulkSet?

gremlin tinkerpop janusgraph
1个回答
2
投票

讨论用Gremlin进行分页 此处 和参考文献 本博文 其中提供了有关该主题的其他信息。这些资源应该有助于你的分页策略。

你提出这个问题的目的是为了询问 BulkSet 所以和我参考的答案不太重复,所以我尽量为你解答这么多。BulkSet 允许在TinkerPop中进行一个重要的遍历优化,它有助于减少对象传播,从而减少特定查询的内存需求。它通过持有遍历对象和它的counter来实现,其中counter是该对象被添加到的次数。BulkSet. 呼叫 size()longSize() (其中后者返回一个 long 和前者的回报 int)将返回计数的总和,从而返回对象的 "正确 "或实际计数。调用 uniqueSize() 将返回集合的实际大小,也就是其中的唯一对象。

如果你想知道 BulkSet 你只需要 count() 它。

gt.V().hasLabel("user").sideEffect(__.count().store("total"))
    .order().by("name", Order.desc)
    .range(0, 10).fold().as("list")
    .select("list","total")
      .by().
      .by(count(local))

我觉得你的穿越并没有达到你的目的 该 sideEffect() 只是对当前的遍历器进行计数,而遍历器会简单地返回 "1",然后你把这个 "1 "存储在 "总计 "列表中。至少我在TinkerGraph中看到的是这样。

gremlin> g.V().hasLabel("person").sideEffect(count().store("total")).range(0,1).fold().as('list').select('list','total').by().by(count(local))
==>[list:[v[1]],total:1]
gremlin> g.V().hasLabel("person").sideEffect(count().store("total")).range(0,10).fold().as('list').select('list','total').by().by(count(local))
==>[list:[v[1],v[2],v[4],v[6]],total:4]

有趣的是,JanusGraph给你的 "总数 "是114而不是10. 我没想到会这样。我会考虑避免依赖这个 "功能",以防它是一个 "bug",后来被 "修复 "了。相反,请考虑我提供的帖子,看看它们是否有启发。

© www.soinside.com 2019 - 2024. All rights reserved.