在 Gremlin 中找到子树差异
Find the subtree difference in Gremlin
我在 gremlify 上描述了这里的图表。所以我有四种类型的顶点:Content、User、Group 和 视频。 Content和Group作为容器,User和Video 是叶子。此外,我在 Group 和 User、Group 和 内容、组和视频。 User 也可以直接分配给 Video 和 Content。 Video 可以添加到 Content 顶点。当 Content 从 Group 中删除时,我必须计算树的差异。我创建了一个从 Content 遍历的查询,聚合所有直接分配的 Users,然后减去那些 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')
但是,也有一些缺点:
- 我怀疑从规模和性能的角度来看查询是否是最佳的,因为在一个组中有 10 万个用户 - 它几乎消耗了我所有的 RU
- 我需要单独计算每个用户的 Video 访问权限(没什么大不了的)
- 我无法在添加的 ORM 框架中编写此查询,因为
aggregate
在那里创建了一个新范围,并且不可能在第二个选项步骤中引用该聚合集合。
所以我的问题是:是否可以在没有 choose
步骤的情况下重写此查询(保持单一)?
如果我了解您的用例,您可以通过遍历内容找到这些用户。因此您可以避免 aggregate
和 choose
步骤。
g.V().hasLabel('Content').
as('content').
in('Assigned').hasLabel('Group').out('Added').
not(where(out('Assigned').
as('content')))
我在 gremlify 上描述了这里的图表。所以我有四种类型的顶点:Content、User、Group 和 视频。 Content和Group作为容器,User和Video 是叶子。此外,我在 Group 和 User、Group 和 内容、组和视频。 User 也可以直接分配给 Video 和 Content。 Video 可以添加到 Content 顶点。当 Content 从 Group 中删除时,我必须计算树的差异。我创建了一个从 Content 遍历的查询,聚合所有直接分配的 Users,然后减去那些 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')
但是,也有一些缺点:
- 我怀疑从规模和性能的角度来看查询是否是最佳的,因为在一个组中有 10 万个用户 - 它几乎消耗了我所有的 RU
- 我需要单独计算每个用户的 Video 访问权限(没什么大不了的)
- 我无法在添加的 ORM 框架中编写此查询,因为
aggregate
在那里创建了一个新范围,并且不可能在第二个选项步骤中引用该聚合集合。
所以我的问题是:是否可以在没有 choose
步骤的情况下重写此查询(保持单一)?
如果我了解您的用例,您可以通过遍历内容找到这些用户。因此您可以避免 aggregate
和 choose
步骤。
g.V().hasLabel('Content').
as('content').
in('Assigned').hasLabel('Group').out('Added').
not(where(out('Assigned').
as('content')))