ArangoDB 3.2遍历:排除边缘集合

时间:2017-09-27 13:06:51

标签: filter arangodb graph-traversal

我正在使用ArangoDB 3.2进行AQL遍历,我在其中检索连接到我的vertexCollection的节点,如下所示:

For v, e, p IN 1..10 ANY vertexCollection GRAPH myGraph OPTIONS {uniqueVertices: "global", bfs:true}
    RETURN v._id

现在我想跳过使用特定边集合的路径中的节点。我知道我可以过滤列表中的特定属性,例如FILTER p.edges[*].type ALL == 'whatever',但我找不到如何将其应用到IS_SAME_COLLECTION()以按集合过滤。

我放弃了在遍历中精确指定edgeCollection而不是GRAPH的选项,因为它只是我想要避免的一个特定edgeCollection,而不是我想要经历的那些。

我不知道在图遍历中是否已经存在“跳过边缘集合”或类似的实现,到目前为止我找不到它。

注意:

我试图像这样过滤

For v, e, p IN 1..10 ANY vertexCollection GRAPH myGraph OPTIONS {uniqueVertices: "global", bfs:true}
    FILTER NOT IS_SAME_COLLECTION('edgeToSkip', e._id) 
    RETURN v._id

但在这里,我只是避免与边缘'edgeToSkip'直接连接的节点,而不是存在'edgeToSkip'所在路径中的所有节点。所以我需要,不仅要排除那个特定的边缘,还要在找到它时停止遍历。

由于

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法,基本上,我收集“路径”中存在的所有边缘,然后过滤掉是否要跳过的边缘在“路径”中。注意,我从uniqeVertices:“ global”更改为uniqueVertices:“ path”。

For v, e, p IN 1..10 ANY vertexCollection GRAPH myGraph OPTIONS {uniqueVertices: "path", bfs:true}
    # collect edge names (collection name) in the current path
    LET ids = (
                FOR edge IN p.edges
                    RETURN PARSE_IDENTIFIER(edge)["collection"]
                   )
    # filter out if edge name (edgeToSkip) is present
    FILTER 'edgeToSkip' NOT IN ids
    RETURN v._id

这样,一旦在路径中找到edgeToSkip,就不会返回任何顶点,而是在“ edgeToSkip”之前的顶点是

如果图形是这样的:

vertexA --edge1--> vertexB --edge2--> vertexC --edgeToSkip--> vertexD --edge3--> vertexE

会返回:

vertexAvertexBvertexC(但不是vertexDvertexE