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

时间:2019-01-10 11:22:35

标签: arangodb

我正在尝试在arangodb周围找到自己的方式,主要是对其中的图形部分感兴趣。我试图了解的一件事是,如何在同一边集合上切换图遍历的方向。使用https://docs.arangodb.com/3.4/AQL/Tutorial/Traversal.html#childof-relations中的示例图,如何获得乔佛里的叔叔,例如在Cypher中,(joffrey)-[CHILDOF]->(父母)-[CHILDOF]->(祖父母)<-[CHILDOF]-(叔叔)是什么? (我希望能找到提利昂)

1 个答案:

答案 0 :(得分:1)

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

例如,您从乔佛里(Joffrey)越过他的父母到他的祖父母外出2..1,然后从外祖父母到父母的兄弟姊妹(外出,乔弗里的叔叔和阿姨,或给出了示例数据集,而不是他的叔叔提利昂·兰尼斯特(Tyrion Lannister)。

Game of Thrones - ChildOf Graph Visualization

但要注意:

  • 跟随他的祖父母(这里只有Tywin)朝着INBOUND方向前进,不仅会给你提利昂,而且还会给他的父母Jaime和Cersei。
  • 如果是单个遍历,则默认选项'uniqueEdges:'path'将阻止Joffrey的父母返回,因为他们本来已经在通往Tywin的路上。
  • 要解决此问题,我们可以确定父级,并从INWINUND方向从Tywin开始遍历过滤掉它们。
  • 另一个收获是乔佛里的父母是兄弟姐妹。要避免从2.off.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"那样仅过滤他的叔叔,但是您会明白。