在 Gremlin 查询语言中比较 2 个聚合(顶点集)的最有效方法

问题描述 投票:0回答:1

比较 2 个聚合(顶点集)并查看它们是否包含完全相同的结果的最有效方法是什么?

使用这个似乎不起作用:

.where(select('aggregate1').is(eq('aggregate2')))

aggtegate1 和aggregate2 每个都包含一堆顶点。

gremlin tinkerpop
1个回答
0
投票

评估两个集合的相等性应该可行,但它们可能都需要是有序集合。例子

g.inject([1,2,3]).is(eq([1,2,3]))

...提供匹配并返回...

1   [1, 2, 3]

但是,如果我改变第二组的顺序,就像......

g.inject([3,2,1]).is(eq([1,2,3]))

...然后什么也没有返回(显示不等价)。

您需要在查询中插入

order(local)
,以确保第一组的顺序与第二组匹配:

g.inject([3,2,1]).order(local).is(eq([1,2,3]))

退货:

1   [1, 2, 3]

顺便说一句...

如果要寻找两者之间的差异,您可以使用

where(within('x'))
where(without('x'))
来分别查看交集或补集。

作为使用航线数据集的示例,如果我想查找从 MLI 和 ABE 出发的常见目的地机场,我可以使用以下查询:

g.V().hasLabel('airport').has('code','MLI').
    out('route').
    aggregate('mlir').limit(1).
    V().hasLabel('airport').has('code','ABE').
    out('route').
    aggregate('aber').
    where(within('mlir')).values('code')

返回结果:

1   PIE
2   ATL
3   ORD
4   SFB
5   DTW

如果我想查看哪些目的地机场属于一组而不是另一组,我可以使用:

g.V().hasLabel('airport').has('code','MLI').
    out('route').
    aggregate('mlir').limit(1).
    V().hasLabel('airport').has('code','ABE').
    out('route').
    aggregate('aber').
    where(without('mlir')).values('code')

结果:

1   CLT
2   MYR
3   BNA
4   FLL
5   PGD
6   PHL
© www.soinside.com 2019 - 2024. All rights reserved.