ArangoDB 3.2遍历:排除边集合

ArangoDB 3.2 traversal: exclude edge collection

我正在使用 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。

我不知道在图遍历中是否已经有 'skip edge collection' 或类似的实现,目前我找不到它。

注:

我试过这样过滤

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' 的所有节点。所以我需要,不仅要排除那个特定的边缘,而且在找到它时停止遍历。

谢谢

更新:

我找到了一个解决方法,基本上我收集了 'path' 中存在的所有边缘,然后过滤掉我想要跳过的边缘是否在 'path' 中。请注意,我从 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,就不会 return 编辑任何顶点,而是 'edgeToSkip' 之前的顶点

如果图表是这样的:

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

会 return:

vertexAvertexBvertexC(但不是 vertexDvertexE

我找到了一个解决方法,基本上我收集了 'path' 中存在的所有边缘,然后过滤掉我想要跳过的边缘是否在 'path' 中。请注意,我从 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,就不会 return 编辑任何顶点,而是 'edgeToSkip' 之前的顶点

如果图表是这样的:

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

会 return:

vertexAvertexBvertexC(但不是 vertexDvertexE