【问题标题】:retrieve vertices with no linked edge in arangodb在 arangodb 中检索没有链接边的顶点
【发布时间】:2016-03-28 21:44:38
【问题描述】:

检索相关edge_collection中没有边的所有顶点的最佳方法是什么

我尝试使用以下代码,但自 arangodb 2.8 以来它变得非常慢(在以前的版本中速度不是很快,但比现在快了大约 10 倍)。大约 1000 个边和大约 3000 个顶点的集合大小需要 30 多秒。

FOR v IN vertex_collection  
    FILTER LENGTH( EDGES(edge_collection, v._id, "outbound"))==0
RETURN v._id

...

更新

...

玩了一会儿后,我来到了以下查询

LET vIDs = (FOR v IN vertex_collection
            RETURN v._id)
LET vEdgesFrom = (FOR e IN edge_collection
                  FILTER e._from IN vIDs
                  RETURN e._from)
FOR v IN vertex_collection
    FILTER v._id IN MINUS(vIDs, vEdgesFrom)
RETURN v._id

这个速度要快得多(大约 0.05 秒),但看起来仍然可以解决一些问题(只是考虑我们需要查询的边缘集合不止一个)。

所以我仍在寻找在特定边集合中找到没有边的顶点的最佳方法。

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    我的建议是类似的——宁可使用joins 而不是图形特征。

    FOR oneEdge IN edges
    LET vertices=(FOR oneVertex IN vertices
            FILTER oneEdge._from == oneVertex._id OR
                   oneEdge._to == oneVertex._id
            RETURN 1)
    FILTER LENGTH(vertices) < 2
    RETURN {v: vertices, e: oneEdge}
    

    查找_from 和_to 之一指向nil 的所有边,然后将其删除。

    注意RETURN 1,它将减少从内部查询传递的数据量。

    【讨论】:

    • 我认为它应该是 oneEdge._to == oneVertex._id ,对吧?此查询的顶点不总是 1 吗?
    • 是的,舒尔。固定。
    猜你喜欢
    • 2021-10-11
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多