ArangoDB 3.2遍历:排除边集合

ajsxfq5m  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(139)

我正在使用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,而不是我想遍历的许多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'的节点。所以我不仅需要排除该特定边,而且需要在找到它时停止遍历。
谢谢

更新

我找到了一个变通办法,基本上我收集所有的边出现在'路径',然后过滤掉如果我想跳过的边是在'路径'。注意我从uniqeVertices:“全局”到唯一顶点:“路径”。

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

wlwcrazw

wlwcrazw1#

我找到了一个变通办法,基本上我收集所有的边出现在'路径',然后过滤掉如果我想跳过的边是在'路径'。注意我从uniqeVertices:“全局”到唯一顶点:“路径”。

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

相关问题