高效的ArangoDB AQL查询,可在集合中查找所有指向和来自相同文档的边缘

wribegjk  于 2022-12-09  发布在  Go
关注(0)|答案(2)|浏览(172)

我有一个ArangoDB,它有两个集合,一个用于Documents,一个用于Edges,我希望有一个高效的查询,能够只返回共享相同_to_from值的Edges。
例如,假设我的文档集合包含A、B、C和D。还假设我的边缘集合包含X、Y和Z。
边X是_from A和_to B。
边Y也是_from A和_to B。
边Z是_from C和_to D。
但是,我不知道X和Y基本上是相同的边,也不知道共享相似边的文档是A和B。我的查询是找出这些重复的边。
目前为止,我所掌握的情况如下:

FOR ec1 IN edge_collection
    FOR ec2 IN edge_collection
        FILTER ec1._key != ec2._key AND ec1._to == ec2._to AND ec1._from == ec2._from
        RETURN ec1

这似乎是可行的,尽管感觉效率非常低。有没有更好的方法来实现这一点,或者这是AQL的最佳解决方案?

rkttyhzu

rkttyhzu1#

可以按_from_to分组,计算每组有多少条边,然后过滤出唯一的组合:

FOR ec IN edge_collection
  COLLECT from = ec._from, to = ec._to WITH COUNT INTO count
  FILTER count > 1
  RETURN { from, to, count }

或者,如果您也要返回边缘关键点:

FOR ec IN edge_collection
  COLLECT from = ec._from, to = ec._to INTO edges = ec._key
  LET count = LENGTH(edges)
  FILTER count > 1
  RETURN { from, to, count, edges }

或者,使用聚合代替后期计算:

FOR ec IN edge_collection
  COLLECT from = ec._from, to = ec._to AGGREGATE count = LENGTH(1) INTO edges = ec._key
  FILTER count > 1
  RETURN { from, to, count, edges }

要返回完整的边缘,请使用INTO edges = ec。您也可以只使用INTO edges,但这样每个边缘都将嵌套在对象{"ec": … }中。

mpbci0fu

mpbci0fu2#

经过进一步的研究,我发现了一种使用COLLECT语句的明显更快的方法。
此外,完全披露,这是我建立了this other answer

LET duplicates = (
    FOR ec IN edge_collection
        COLLECT from = ec._from, to = ec._to WITH COUNT INTO count
        FILTER count > 1
        RETURN {
            from: from,
            to: to,
            count: count
        }
)

FOR d IN duplicates
    FOR ec IN edge_collection
        FILTER d.from == ec._from AND d.to == ec._to
        RETURN ec

编辑:
基于@CodeManX的答案,我的最终目标是能够删除这些重复的值,或者更确切地说是REMOVE这些重复的值。如果有人出于类似的目的偶然发现了这一点,这可能会有所帮助:

LET duplicates = (
    FOR ec IN edge_collection
        COLLECT from = ec._from, to = ec._to AGGREGATE count = LENGTH(1) INTO edges = ec._key
        FILTER count > 1
        RETURN { from, to, count, edges }
)

FOR d IN duplicates
    LET key_to_delete = FIRST(d.edges)
    REMOVE { _key: key_to_delete } IN edge_collection

相关问题