我正在尝试找到有关 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)
在 AQL 中,您无法更改在单次遍历中跟踪一个或同一边集合的边的方向,但您可以进行后续遍历。
例如,您从 Joffrey 的父母到他的祖父母遍历 2..2 OUTBOUND,然后从祖父母到父母的兄弟姐妹(Joffrey 的叔叔和阿姨,或者给定示例数据集,而不是仅)遍历 1..1 INBOUND他的叔叔提利昂·兰尼斯特)。
但要注意:
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"
那样过滤以仅获取他的叔叔,但您明白了。