【问题标题】:TinkerPop not getting correct count type with traversalTinkerPop 没有通过遍历获得正确的计数类型
【发布时间】:2020-09-23 08:42:49
【问题描述】:

我想检索特定范围的用户(分页所需)并且还想检索总计数,我正在执行以下查询,该查询按预期检索用户顶点列表,但返回总计数如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();

输出如下

如何将正确的计数作为Long 值而不是BulkSet

【问题讨论】:

  • 我不应该在查询中使用 sideEffect 吗?不确定这是否是问题

标签: gremlin tinkerpop janusgraph


【解决方案1】:

讨论了使用 Gremlin 进行分页 here 和参考 this blog post 提供了有关该主题的更多信息。这些资源应该可以帮助您制定分页策略。

您在询问BulkSet 时提出了这个问题,所以它与我引用的答案并不完全重复,所以我会尽量为您回答这么多。 BulkSet 允许在 TinkerPop 中进行重要的遍历优化,这有助于减少对象传播,从而减少特定查询的内存需求。它通过保存遍历器对象及其计数来做到这一点,其中计数是该对象被添加到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”存储在列表“total”中。至少这是我在 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。我没想到。如果它是后来“修复”的“错误”,我会考虑避免依赖该“功能”。相反,请考虑我提供的帖子并从中寻找灵感。

【讨论】:

  • 谢谢。这些帖子真的很有帮助。我总是希望你能回答我与小精灵相关的问题:)
猜你喜欢
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多