retrieve vertices with no linked edge in arangodb

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-12 12:07:29

问题


What is the best way to retrieve all vertices that do not have an edge in a related edge_collection

I've tried to use the following code but it's got incredibly slow since arangodb 2.8 (It was not really fast in previous versions but round about 10 times faster as now). It takes more than 30 seconds on collection sizes of around 1000 edges and around 3000 vertices.

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

...

update

...

After playing around a bit I came to the following query

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

This one is much faster (around 0.05s) but still looks like some kind of work around (just thinking of more than one edge collections we need to query against).

So I'm still looking for the best method to find vertices having no edge in specific edge collections.


回答1:


My sugestion was going to be similar - rather use joins than graph features.

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}

to find all edges where one of _from and _to would point into nil, and then subsequently delete it.

Note the RETURN 1 which will reduce the amount of data passed up from the inner query.



来源:https://stackoverflow.com/questions/36271753/retrieve-vertices-with-no-linked-edge-in-arangodb

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!