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:
vertexA
、vertexB
和 vertexC
(但不是 vertexD
和 vertexE
)
我找到了一个解决方法,基本上我收集了 '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:
vertexA
、vertexB
和 vertexC
(但不是 vertexD
和 vertexE
)
我正在使用 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:
vertexA
、vertexB
和 vertexC
(但不是 vertexD
和 vertexE
)
我找到了一个解决方法,基本上我收集了 '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:
vertexA
、vertexB
和 vertexC
(但不是 vertexD
和 vertexE
)