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

问题描述 投票:0回答:1

我正在尝试找到有关 arangodb 的方法,主要对它的图形部分感兴趣。我试图理解的一件事是如何在同一边集合上切换图遍历的方向。使用https://github.com/arangodb/docs/blob/28b266f143232beb17e5c35cd545d4f3909a1815/3.4/aql/tutorial-traversal.md#childof-relations中的示例图,我怎样才能得到乔佛里的叔叔,例如在 Cypher 中,什么是 (joffrey)-[CHILDOF]->(parent)-[CHILDOF]->(grandparent)<-[CHILDOF]-(uncle)? (I am expecting Tyrion to be found)

arangodb
1个回答
1
投票

在 AQL 中,您无法更改在单次遍历中跟踪一个或同一边集合的边的方向,但您可以进行后续遍历。

例如,您从 Joffrey 的父母到他的祖父母遍历 2..2 OUTBOUND,然后从祖父母到父母的兄弟姐妹(Joffrey 的叔叔和阿姨,或者给定示例数据集,而不是仅)遍历 1..1 INBOUND他的叔叔提利昂·兰尼斯特)。

但要注意:

  • 沿着入站方向跟随他的祖父母(这里只有泰温)的边缘不仅会给你提利昂,还会给你他的父母詹姆和瑟曦。
  • 如果是单次遍历,默认选项 `uniqueEdges: 'path' 将阻止返回乔佛里的父母,因为他们已经在通往泰温的路上了。
  • 为了解决这个问题,我们可以在从Tywin开始的INBOUND方向的遍历中确定父母并过滤掉他们。
  • 另一个问题是乔佛里的父母是兄弟姐妹。为了在 2..2 OUTBOUND 方向从 Joffrey 开始的遍历中不返回 Tywin 两次,我们可以使用遍历选项
    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"
那样过滤以仅获取他的叔叔,但您明白了。

© www.soinside.com 2019 - 2024. All rights reserved.