如何将ArangoDB图查询结果聚合为单对象的节点边数组?
AQL查询树形图:将节点和边合并为单个对象返回
我有一个由顶点集合(vertex collection)和边集合(edge collection)组成的树形图(tree),希望编写AQL查询返回深度最大为2的节点与边,以单个对象的形式返回。
当前使用的查询语句
FOR v,e IN 0..1 OUTBOUND 'nodes/root' GRAPH 'myGraph' OPTIONS { uniqueVertices: 'path', order: 'bfs' } RETURN {"nodes":v, "edges":e}
当前返回结果
[ { "nodes": { "_key": "root", "_id": "nodes/root", "metadata": {} }, "edges": null }, { "nodes": { "_key": "sys-1", "_id": "nodes/sys-1", "metadata": {} }, "edges": { "_key": "sys-1-root", "_id": "relationships/sys-1-root", "_from": "nodes/root", "_to": "nodes/sys-1", "metadata": null } }, { "nodes": { "_key": "sys-4", "_id": "nodes/sys-4", "metadata": {} }, "edges": { "_key": "sys-4-root", "_id": "relationships/sys-4-root", "_from": "nodes/root", "_to": "nodes/sys-4", "metadata": null } } ]
期望返回结果
[ { "nodes":[ { "_key":"root", "_id":"nodes/root", "metadata":{ } }, { "_key":"sys-1", "_id":"nodes/sys-1", "metadata":{ } }, { "_key":"sys-4", "_id":"nodes/sys-4", "metadata":{ } } ], "edges":[ null, { "_key":"sys-1-root", "_id":"relationships/sys-1-root", "_from":"nodes/root", "_to":"nodes/sys-1", "metadata":null }, { "_key":"sys-4-root", "_id":"relationships/sys-4-root", "_from":"nodes/root", "_to":"nodes/sys-4", "metadata":null } ] } ]
解决方案
可以通过COLLECT INTO语句将遍历得到的节点和边分别聚合为数组,最终返回包含这两个数组的单个对象:
FOR v,e IN 0..1 OUTBOUND 'nodes/root' GRAPH 'myGraph' OPTIONS { uniqueVertices: 'path', order: 'bfs' } COLLECT INTO nodes = v, edges = e RETURN { nodes, edges }
或者先将遍历结果存入变量,再通过数组展开语法提取节点和边数组:
LET traversal = ( FOR v,e IN 0..1 OUTBOUND 'nodes/root' GRAPH 'myGraph' OPTIONS { uniqueVertices: 'path', order: 'bfs' } RETURN { node: v, edge: e } ) RETURN { nodes: traversal[*].node, edges: traversal[*].edge }
这两种写法都能实现需求:将所有节点汇总到nodes数组,所有对应边汇总到edges数组,最终返回一个包含这两个数组的对象(包裹在数组中,与期望结构一致)。
内容的提问来源于stack exchange,提问作者Erik Gomez
相关产品推荐
相关产品推荐

