You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:20:33