【问题标题】:How to merge aql query with iterative traversal如何将 aql 查询与迭代遍历合并
【发布时间】:2019-07-27 00:06:35
【问题描述】:

我想使用 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": []
  }
]

我已经验证有边,并且当它不作为子查询执行时,遍历正确返回。

似乎初始查询在子查询返回结果之前完成,结果如下。

我错过了什么?还是有更好的方法?

【问题讨论】:

  • 您查询的方式是正确的。这一定是与数据相关的问题。你确定你锯的边缘引用了你试图用ne.identifier == "12345"过滤的对象吗?
  • 顺便说一句,energy 是什么?是收藏吗?如果是这样,您发布的输出应该会有所不同。它还应该包含一些系统属性,例如_key_id。可能这是一个问题。当您进行遍历时,您必须指定起始对象的对象或 _id 值。如果ne 不是具有_id 属性的对象,则遍历将不起作用。
  • @PeterLiapin energy 是一个集合,是的。我给出的代码是虚拟代码,只是为了代表而不是精确的输出。我应该在我的问题中提到这一点,抱歉。

标签: traversal arangodb aql


【解决方案1】:

我可以想到两种方法来做到这一点。第一个更容易理解,但第二个更紧凑。对于下面的示例,我有一个顶点集合 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"
    ]
  }
]

【讨论】:

  • 我尝试了这两种方法,虽然我喜欢第二种方法,但它仍然返回一个空的。我不确定为什么它适用于您的系统而不是我的系统,您使用的是什么版本的 ArangoDB,以及在什么操作系统上运行?我目前在 Windows 10 上使用 3.4...谢天谢地,第一种方法有效,但在我的场景中并不理想
  • 我刚刚又试了一次,这两种方法都可以在我的机器上运行。我在我的 Mac 的官方 arangodb docker 映像中运行 arangodb 3.4.0(社区)。也许它与数据有关?如果您添加一些示例数据,我可以在我的机器上进行尝试。我认为它不起作用的唯一原因是数组扩展的输入实际上不是数组。然后它将返回空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2021-08-22
  • 2016-12-15
  • 1970-01-01
相关资源
最近更新 更多