【问题标题】:ArangoDB 3.2 traversal: exclude edge collectionArangoDB 3.2 遍历:排除边集合
【发布时间】:2017-09-27 13:06:50
【问题描述】:

我正在使用 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,而我想要跳过的还有很多。

我不知道在图遍历中是否已经有“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”的所有节点。所以我需要,不仅要排除那个特定的边缘,还要在找到它时停止遍历。

谢谢

更新

我找到了一种解决方法,基本上我收集了“路径”中存在的所有边缘,然后过滤掉我想要跳过的边缘是否在“路径”中。注意我从 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

【问题讨论】:

  • 嗨,即使我正在寻找相同场景的解决方案。你发现了吗-Dovi
  • 我找到了解决方法,我已经更新了帖子并添加了答案。

标签: filter arangodb graph-traversal


【解决方案1】:

我找到了一种解决方法,基本上我收集了“路径”中存在的所有边缘,然后过滤掉我想要跳过的边缘是否在“路径”中。注意我从 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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2020-12-27
  • 1970-01-01
  • 2014-04-11
相关资源
最近更新 更多