TinkerPop 无法通过遍历获得正确的计数类型

TinkerPop not getting correct count type with traversal

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

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

你在询问 BulkSet 时提出了这个问题,所以它与我引用的答案并不完全相同,所以我会尽量为你回答那么多。 BulkSet 允许在 TinkerPop 中进行重要的遍历优化,这有助于减少对象传播,从而减少特定查询的内存需求。它通过保存遍历器对象及其计数来实现,其中计数是该对象已添加到 BulkSet 的次数。调用 size()longSize()(其中后者 return 是 long 而前者 return 是 int)将 return 求和的计数,因此 "correct" 或对象的实际计数。调用 uniqueSize() 将 return 集的实际大小,这将是其中的唯一对象。

如果你想要 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() 只是计算当前遍历器,它将简单地 return “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 而不是 "total" 的 10。我不希望那样。我会考虑避免依赖 "feature",因为它是 "bug",后来是 "fixed"。相反,请考虑我提供的帖子并查看它们以获取灵感。