Gremlin中高效比较两个顶点聚合集是否完全相同的方法
Gremlin中比较两个顶点聚合集是否完全相同的可行方案
你之前用.where(select('aggregate1').is(eq('aggregate2')))无效的原因是:Gremlin里aggregate返回的是List对象,直接用eq比较的是对象引用而非集合内容——即使两个集合元素完全一致,只要是不同的List实例就会判定为不相等。
下面是两种高效的解决方法:
方法一:元素互包含+数量校验(兼容所有Gremlin版本)
先校验两个集合的元素数量相等,再确保第一个集合的所有元素都存在于第二个集合中(数量相等+单向包含即可双向覆盖):
// 假设已完成aggregate('aggregate1')和aggregate('aggregate2')操作 .where(select('aggregate1').count().is(eq(select('aggregate2').count()))) .where(select('aggregate1').unfold().is(within(select('aggregate2'))).count().is(eq(select('aggregate1').count())))
方法二:使用setEquals步骤(Gremlin 3.5+版本可用)
TinkerPop 3.5及以上版本提供了setEquals步骤,可直接判断两个集合的元素是否完全相同(忽略顺序):
.where(select('aggregate1').setEquals(select('aggregate2')))
如果你的场景需要匹配带重复次数的集合,可先对元素分组计数,再比较计数结果:
.where( select('aggregate1').unfold().groupCount().as('count1'), select('aggregate2').unfold().groupCount().as('count2') ).where('count1', eq('count2'))
内容的提问来源于stack exchange,提问作者Amin
相关产品推荐
相关产品推荐

