如何将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": []
}
]
我已验证存在边,并且在未作为子查询执行时遍历 returns 正确。
似乎在从子查询返回结果之前初始查询已完成,给出以下结果。
我错过了什么?或者有更好的方法吗?
我可以想到两种方法来做到这一点。第一个更容易理解,但第二个更紧凑。对于下面的示例,我有一个顶点集合 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}
上面我们先得到了我们要遍历的item(seed),然后进行遍历,得到一个有seed.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"
]
}
]
我想使用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": []
}
]
我已验证存在边,并且在未作为子查询执行时遍历 returns 正确。
似乎在从子查询返回结果之前初始查询已完成,给出以下结果。
我错过了什么?或者有更好的方法吗?
我可以想到两种方法来做到这一点。第一个更容易理解,但第二个更紧凑。对于下面的示例,我有一个顶点集合 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}
上面我们先得到了我们要遍历的item(seed),然后进行遍历,得到一个有seed.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"
]
}
]