在图形查询中的同一边集合上切换方向

Switching direction on the same edge collection within a graph query

我正在尝试围绕 arangodb 寻找方法,主要对它的图形部分感兴趣。我试图理解的一件事是如何在同一边集合上切换图形遍历的方向。使用 https://docs.arangodb.com/3.4/AQL/Tutorial/Traversal.html#childof-relations 中的示例图,我怎样才能得到 Joffrey 的叔叔,例如Cypher 中的什么是 (joffrey)-[CHILDOF]->(parent)-[CHILDOF]->(grandparent)<-[CHILDOF]-(uncle)? (我期待提利昂被发现)

在 AQL 中,您无法在单次遍历中更改沿着同一个边集合的边的方向,但您可以进行 follow-up 遍历。

例如,您从 Joffrey 遍历 2..2 OUTBOUND 经过他的 parents 到他的 grandparents,然后从 grandparents 遍历 1..1 INBOUND 到parents 的兄弟姐妹(Joffrey 的叔叔和阿姨,或者给出示例数据集,而不是只有他的叔叔 Tyrion Lannister)。

但要注意:

  • 沿 INBOUND 方向从他的祖父parents(这里只有 Tywin)出发,不仅会给你提利昂,还会给你他的 parents Jaime 和 Cersei。
  • 如果是单次遍历,默认选项 `uniqueEdges: 'path' 会阻止 Joffrey 的 parents 被 returned,因为它们已经在路径上了去泰温的路。
  • 为了解决这个问题,我们可以确定 parents 并在从 Tywin 开始的 INBOUND 方向的遍历中过滤掉它们。
  • 另一个问题是乔佛里的 parents 是兄弟姐妹。为了不让 return Tywin 在从 Joffrey 开始的 2..2 OUTBOUND 方向的遍历中两次,我们可以使用遍历选项 uniqueVertices: "global", bfs: true (需要启用 bfs 才能使用 uniqueVertices: "global").

所以完整的查询可能如下所示:

LET joffrey = FIRST(
  FOR c IN Characters
    FILTER c.name == "Joffrey"
    LIMIT 1
    RETURN c
)
LET parents = (
  FOR v IN OUTBOUND joffrey ChildOf
    RETURN v
)
LET grandparents = (
  FOR v IN 2..2 OUTBOUND joffrey ChildOf
    OPTIONS {uniqueVertices: "global", bfs: true}
    RETURN v
)
LET unclesAndAunts = (
  FOR gp IN grandparents
    FOR v IN INBOUND gp ChildOf
      OPTIONS {uniqueVertices: "global", bfs: true} // needed?
      FILTER v NOT IN parents
      RETURN v
)
RETURN unclesAndAunts

数据集没有性别属性,因此您不能像 FILTER v NOT IN parents AND v.gender == "male" 那样进行过滤以仅获取他的叔叔,但您明白了。