【问题标题】:Find the subtree difference in Gremlin在 Gremlin 中查找子树差异
【发布时间】:2021-06-04 02:24:56
【问题描述】:

我在gremlify 上描述了这个图表。所以我有四种类型的顶点:ContentUserGroupVideoContentGroup 作为容器,UserVideo 是叶子。另外,我在 GroupUserGroupContent 之间可能存在边线>组和一个视频User 也可以直接分配给 VideoContentVideo 可以添加到 Content 顶点。当 ContentGroup 中删除时,我必须计算树的差异。我创建了一个从 Content 遍历的查询,聚合所有直接分配的 Users,然后从 Group 中减去那些 Users成员集:

g.V().has('ContentId', 1).in('Assigned').
  choose(label()).
  option('User', __.aggregate('DirectAssign')).
  option('Group', __.out('Added').where(without('DirectAssign')).
      as('ToDrop'))
      .select('ToDrop')

但是,也有一些缺点:

  • 我怀疑从规模和性能的角度来看,查询是否是最佳的,因为对于一个组中的 100k 用户 - 它几乎消耗了我所有的 RU
  • 我需要分别计算每个用户的视频访问权限(没什么大不了的)
  • 我无法在添加的 ORM 框架中编写此查询,因为 aggregate 在那里创建了一个新范围,并且无法在第二个选项步骤中引用该聚合集合。

所以我的问题是:是否可以在没有 choose 步骤的情况下重写此查询(保持单一)?

【问题讨论】:

    标签: gremlin azure-cosmosdb-gremlinapi


    【解决方案1】:

    如果我了解您的用例,您可以通过遍历内容找到这些用户。因此您可以避免aggregatechoose 步骤。

    g.V().hasLabel('Content').
        as('content').
      in('Assigned').hasLabel('Group').out('Added').
      not(where(out('Assigned').
            as('content')))
    

    示例:https://gremlify.com/ozhf4t0xv4j

    【讨论】:

    • 像魅力一样工作,完美。你能在最后用as解释一下这个神奇的地方吗?
    • @vmeln as 不是一个常规步骤,它的行为会根据他所处的上下文而有所不同(类似于by 步骤)。在where 步骤中,他没有标记顶点,而是将其与已经标记的顶点进行比较。这是 gremlin 中的常见配方,您可以在任何循环检测查询中找到它
    猜你喜欢
    • 2010-12-08
    • 2012-08-29
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多