繁体   English   中英

高效的 ArangoDB AQL 查询,可以找到集合中 go 到和来自相同文档的所有边

[英]Efficient ArangoDB AQL query that can find all Edges in Collection that go To and From the same Documents

我有一个带有两个 collections 的 ArangoDB,一个用于文档,一个用于边缘,我想要一个高效的查询,它只能返回共享相同_to_from值的边缘。

例如,假设我的文档集合包含 A、B、C 和 D。我们还假设我的边缘集合包含 X、Y 和 Z。

边 X 是_from A 和_to B。

边 Y 也是_from A 和_to B。

边 Z 是_from C 和_to D。

但是,我不知道X和Y是基本相同的Edge,我也不知道共享相似Edge的Document是A&B。我的查询是找出这些重复的Edge。

我到目前为止看起来像这样:

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

这似乎有效,尽管它也感觉非常低效。 有没有更好的方法来 go 这样做,或者这是 AQL 的最佳解决方案?

经过更多的挖掘,我发现使用COLLECT语句的方法要快得多。

此外,充分披露,这是我建立在这个其他答案的基础上。

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 的回答,我的最终目标是能够删除或删除这些重复值。 如果有人出于类似的目标偶然发现了这一点,这可能会有所帮助:

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

您可以按_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 ,但每个边缘都将嵌套在 object {"ec": … }中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM