如何获得中间顶点数?

时间:2019-10-16 14:58:29

标签: gremlin

假设有一个树状结构。

顶层:仓库

下一层:存储空间

最后一级:存储的物品

我想获取每个仓库的存储空间和存储项目数。

我已经尝试获取“已存储项目”的数量:使用groupCount可以很容易地做到这一点。

g.V().
      hasLabel('Warehouse').
      as('w').
      out('HAS_SPACE').
      hasLabel('Space').
      as('s').
      out('HAS_ITEM').
      hasLabel('Item').
      groupCount().by(select('w')).
      unfold().
      order().by(values, desc).
      limit(100).
      project('WarehouseName', 'ItemsCount').
          by(select(keys).values('Name')).
          by(select(values))

但是我也想获得's'的计数,我想不出任何快速的方法来实现它。我曾考虑过对遍历进行计数,例如:

g.V().
      hasLabel('Warehouse').
      project('WarehouseName', 'SpaceCount', 'ItemCount').
          by('Name').
          by(out('HAS_SPACE').count()).
          by(out('HAS_SPACE').out('HAS_ITEMS').count())

但是它在大量顶点(大约26M)上的工作速度非常慢。

还有其他方法可以计数吗?

1 个答案:

答案 0 :(得分:0)

您可以通过将groupCount用作sideEffect来命名:

g.V().hasLabel('Warehouse').as('w')
  .out('HAS_SPACE').hasLabel('Space').as('s')
  .groupCount('spaceCount').by(select('w'))
  .out('HAS_ITEM').hasLabel('Item')
  .groupCount('itemsCount').by(select('w'))
  .count().select('spaceCount', 'itemsCount')

请注意,这将返回2张地图,一张用于空格,一张用于物品。 如果您需要将其作为一张地图获取,则可以将最后一行替换为:

.count().union(select('spaceCount'),select('itemsCount')).unfold()
.group().by(keys).by(select(values).fold()).unfold()

结果将是一个数组映射,其第一个值为空格数,第二个为项目数。