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"。相反,请考虑我提供的帖子并查看它们以获取灵感。
我想检索特定范围的用户(分页需要)并且还想检索总计数,我正在执行以下查询,它按预期检索用户顶点列表,但总计数返回为 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 进行分页
你在询问 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"。相反,请考虑我提供的帖子并查看它们以获取灵感。