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

syqv5f0l  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(202)

我试图找到我的方式arangodb周围,主要是感兴趣的图形的一部分。我试图理解的一件事是如何在同一个边集合上切换图形遍历的方向。使用https://github.com/arangodb/docs/blob/28 b266 f143232 beb 17 e5 c35 cd 545 d4 f3909 a1815/3.4/aql/tutorial-traversal.md#childof-relations中的示例图,我如何获得Joffrey的叔叔,例如:(joffrey)-[CHILDOF]->(parent)-[CHILDOF]->(grandparent)<-[CHILDOF]-(uncle)是什么意思?(我期待着提利昂被找到)

6ss1mwsb

6ss1mwsb1#

在AQL中,您不能更改在单个遍历中跟随同一个边集合的边的方向,但是您可以执行后续遍历。
例如,您从Joffrey遍历2..2 OUTBOUND,经过他的父母到他的祖父母,然后从祖父母到父母的兄弟姐妹(Joffrey的叔叔和阿姨,或者给定示例数据集,而不是他的叔叔Tyrion Lannister)遍历1..1 INBOUND。

但要注意:

  • 从他的祖父母(这里只有泰温)的边缘在入境方向不仅会给予你提利昂,但他的父母詹姆和瑟曦。
  • 如果是单次遍历,则默认选项`uniqueEdges:“路径”将阻止乔佛里的父母被送回,因为他们已经在通往泰温的路上了。
  • 为了解决这个问题,我们可以确定父节点,并在从泰温开始的INBOUND方向的遍历中过滤掉它们。
  • 另一个问题是乔佛里的父母是兄弟姐妹。为了在2..2 OUTBOUND方向从Joffrey开始的遍历中不返回Tywin两次,我们可以使用遍历选项uniqueVertices: "global", bfs: truebfs需要启用才能使用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"那样过滤,只得到他的叔叔,但你明白了。

相关问题