在 arangodb 中检索没有链接边的顶点
retrieve vertices with no linked edge in arangodb
检索相关 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 秒),但看起来仍然像是某种解决方法(只是考虑我们需要查询的多个边集合)。
所以我仍在寻找在特定边集合中查找没有边的顶点的最佳方法。
我的建议是相似的 - 与其使用图形功能,不如使用 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
这将减少从内部查询向上传递的数据量。
检索相关 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 秒),但看起来仍然像是某种解决方法(只是考虑我们需要查询的多个边集合)。
所以我仍在寻找在特定边集合中查找没有边的顶点的最佳方法。
我的建议是相似的 - 与其使用图形功能,不如使用 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
这将减少从内部查询向上传递的数据量。