ArangoDB 如何在arango ql中返回顶点的所有父节点?

zkure5ic  于 2022-12-09  发布在  Go
关注(0)|答案(2)|浏览(136)

我正在尝试编写一个AQL查询,它返回顶点的所有子顶点和该顶点本身。
例如我有这样的结构:

A      B         C
  |      |         |
  D------          E     F

以下是查询的外观:

for parent in collection
for child in outbound parent link
   RETURN{ parent, 
       child
    }

但它以下列形式返回结果

"child": D
"parent": A

"child": D
"parent":B

"child": E
"parent": C

查询的预期结果如下

"child": D
"parent": A, B

"child": E
"parent": C

"child": F
"parent":

如何修改查询以获得结果?

2wnc66cl

2wnc66cl1#

FOR parent IN VertexCollection FOR child IN OUTBOUND parent EdgeCollection COLLECT c = child.value INTO groups RETURN { child: c, parents: groups[*].parent }
返回类似于下面的内容。但也包含文档的详细信息。[ { "child": "D", "parents": ["A", "B"] }, { "child": "E", "parents": ["C"] } ]
乍一看,这就是我会采用的方法,并且返回的结果与您所寻找的结果基本一致。因为F没有边界,所以您无法从AQL语句的第二部分(FOR child IN OUTBOUND parent EdgeCollection)访问它。此语句将只收集子对象。F从技术上讲不是子对象,也不是父对象,因为它是无边界的。
COLLECT语句非常强大,对于这些类型的分组,它可以进行更深入的研究。https://www.arangodb.com/docs/stable/aql/operations-collect.html

gstyhher

gstyhher2#

经过一番折腾,我最终创建了一个适合我需要的查询。

FOR child in entity
     LET parents = (
            FOR p IN INBOUND child link
            RETURN {parentfp: p.fingerprint, parentTypeFp: p.typeFp})
            RETURN MERGE(\n" +
            {   
              childFp: child.fingerprint,
              childTypeFp: child.typeFp,
              parents
             })

相关问题