繁体   English   中英

如何将Aql查询与迭代遍历合并

[英]How to merge aql query with iterative traversal

我想使用AQL在ArangoDB中查询集合,并在查询的每个节点上使用遍历扩展节点。

我试图通过使用集合查询中的LET语句将遍历作为子查询来调用来实现。 即使查询完成,遍历的结果集也为空。

FOR ne IN energy
    FILTER ne.identifier == "12345"
    LET ne_edges = (
    FOR v, e IN 1..1 ANY ne relation
        RETURN e
    )
    RETURN MERGE(ne, {"edges": ne_edges})

[
  {
    "value": 123.99,
    "edges": []
  }
]

我已经验证了存在边,并且在不作为子查询执行时遍历会正确返回。

从子查询返回结果之前,似乎初始查询已完成,给出了以下结果。

我想念什么? 或者,还有更好的方法?

我可以想到两种方法来做到这一点。 这第一个更容易理解,但是第二个更紧凑。 对于以下示例,我有一个顶点集合test2和一个边缘集合testEdge,它们链接了test2中的父项和子项

使用收集:

let seed = (FOR testItem IN test2
            FILTER testItem._id in ['test2/Q1', 'test2/Q3'] 
            RETURN testItem._id)

let traversal = (FOR seedItem in seed
    FOR v, e IN 1..1 ANY seedItem
    testEdge
RETURN {seed: seedItem, e_to: e._to})

for t in traversal
COLLECT seeds = t.seed INTO groups = t.e_to
return {myseed: seeds, mygroups: groups}

在上方,我们首先获取要遍历的项目(种子),然后执行遍历并获取具有种子.id和相关边的对象,然后最后使用collect into将结果分组

使用数组扩展

FOR testItem IN test2
    FILTER testItem._id in ['test2/Q1', 'test2/Q3']
    LET testEdges = (
    FOR v, e IN 1..1 ANY testItem testEdge
        RETURN e
    )
RETURN {myseed: testItem._id, mygroups: testEdges[*]._to}

这次,我们使用let语句结合了种子搜索和遍历。 然后我们使用数组扩展将项目分组

无论哪种情况,我最终都会看到如下内容:

[
  {
    "myseed": "test2/Q1",
    "mygroups": [
      "test2/Q1-P5-2",
      "test2/Q1-P6-3",
      "test2/Q1-P4-1"
    ]
  },
  {
    "myseed": "test2/Q3",
    "mygroups": [
      "test2/Q3",
      "test2/Q3"
    ]
  }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM