
# 导出job返回结果到文件(2.2.1) - ExportJobResult
#### 功能介绍
用于将异步任务（jobId）的执行结果（result）导出到文件。
- 支持算法列表：
  - pagerank、personalrank、pixie
  
  - louvain、label_propagation、connect_component
  
  - kcore
  
  - sssp、shortest_path（含time_window_shortest_path）、shortest_path_of_vertex_sets、all_shortest_paths、n_paths
  
  - traingle_count、cluster_coefficient、degree_correlation、closeness
  
  - link_prediction
  
  - betweenness、edge_betweenness、od_betweenness
   
- 支持查询列表
  - [Cypher操作API（2.2.16）](https://support.huaweicloud.com/api-ges/ges_03_0212.html)
  
  - [点过滤查询(1.0.0)](https://support.huaweicloud.com/api-ges/ges_03_0023.html)
  
  - [边过滤查询(1.0.0)](https://support.huaweicloud.com/api-ges/ges_03_0024.html)
   
 
#### URI
POST /ges/v1.0/{project_id}/graphs/{graph_name}/jobs/{job_id}/action?action_id=export-result
表1路径参数 
| 参数         | 是否必选 | 类型     | 说明                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|:---|
| project_id | 是    | String | **参数解释：** 项目编号。获取方法，请参见[获取项目ID](https://support.huaweicloud.com/api-ges/ges_03_0111.html)。 **约束限制：** 不涉及。 **取值范围：** 只能由英文字母和数字组成，且长度为\[1-64\]个字符。 **默认取值：** 不涉及。 |
| graph_name | 是    | String | **参数解释：** 图名称。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。                                                                                                          |
| job_id     | 是    | String | **参数解释：** Response对应的任务ID。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。                                                                                           |
   
#### 请求参数
表2Body参数说明 
| 参数            | 是否必选 | 类型      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| exportPath    | 是    | String  | **参数解释：** 导出路径。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。                                                                                                                                                                                     |
| fileName      | 否    | String  | **参数解释：** 导出文件名。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。                                                                                                                                                                               |
| obsParameters | 是    | String  | **参数解释：** OBS认证参数。具体请见[obsParameters参数说明]。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。                                                                                                                       |
| paginate      | 否    | Object  | **参数解释：** 分页参数，导出异步任务API默认关闭分页，具体请见[paginate中各要素说明]。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。                                                                                                                      |
| erase         | 否    | Boolean | **参数解释：** 导出后是否删除原job任务。 **约束限制：** 不涉及。 **取值范围：** - true：表示默认删除job并释放资源。  - false：表示不删除job任务。   **默认取值：** 默认值为true。 |
   
 表3obsParameters参数说明 
| 参数        | 是否必选 | 类型     | 说明                                                                                                                                                                                                                                                                   |
|:---|:---|:---|:---|
| accessKey | 是    | String | **参数解释：** ak值。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。    |
| secretKey | 是    | String | **参数解释：** sk值。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。 |
   
 表4paginate中各要素说明 
| 参数              | 是否必选 | 类型      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|:---|
| enable          | 否    | Boolean | **参数解释：** 是否开启分页。 **约束限制：** 不涉及。 **取值范围：** - false：不开启分页。  - true：开启分页。   **默认取值：** 默认为false。 |
| rowCountPerFile | 否    | Integer | **参数解释：** 按页导出时，每个文件最大行数。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 10000000。                                                                                                                                     |
| numThread       | 否    | Integer | **参数解释：** 按页导出时，并行线程数。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 8。                                                                                                                                             |
| maxSizePerFile  | 否    | Integer | **参数解释：** 按页导出时，每个文件大小的最大值，单位是byte。 **约束限制：** 不涉及。 **取值范围：** 不涉及。 **默认取值：** 不涉及。                                                                                                                                    |
   
- 分页参数说明
  1. 当分页参数开启状态下，请求体中fileName代表目录名，目录下存放分页的文件；分页参数关闭时，fileName代表文件名。导出前请保证文件名指向的路径为空，确保导出时不会覆盖OBS上已有数据。
  
  2. 当numThread的值大于GES图实例使用的机器cpu数时，会配置为机器cpu数。
  
  3. rowCountPerFile的值会影响实际使用的线程数。即当结果集大小和rowCountPerFile的比值小于numThread时，会使用这个比值作为线程数。
  
  4. 如果请求被用户取消，已上传到OBS中的数据不会删除，有关取消Job的API详见[取消Job(1.0.0)](https://support.huaweicloud.com/api-ges/ges_03_0038.html)。
   
- 分页开启时文件名的命名规则： 分页选项中enable参数为true时，fileName代表一个目录，目录下的文件使用线程id与文件编号的组合命名，中间使用"."连接。例如，对于320万条数据，不同配置下第一个文件名和最后一个文件名示例如下：
  
  | rowCountPerFile |    10万     |     10万     |   100万    |   100万    |   500万    |
  |---|---|---|---|---|---|
  | **numThread**   | 2          | 48          | 2         | 5         | 2         |
  | **实际使用的线程**     | 2          | 32          | 2         | 4         | 1         |
  | **单线程生成文件数**    | 16         | 1           | 2         | 1         | 1         |
  | **第一个文件名**      | 00.000.txt | 00.000.txt  | 00.00.txt | 00.00.txt | 00.00.txt |
  | **最后一个文件名**     | 01.015.txt | 031.000.txt | 01.01.txt | 03.00.txt | 00.00.txt |
     
  
 
#### 响应参数
表5响应Body参数说明 
| 参数           | 类型      | 说明                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|
| errorMessage | String  | **参数解释**： 系统提示信息。 - 执行成功时，字段可能为空。  - 执行失败时，用于显示错误信息。   **取值范围**： 不涉及。     |
| errorCode    | String  | **参数解释**： 系统提示信息。 - 执行成功时，字段可能为空。  - 执行失败时，用于显示错误码。   **取值范围**： 不涉及。 |
| jobId        | String  | **参数解释**： 执行该异步任务的jobId。 可以查询jobId查看任务执行状态、获取返回结果，详情参考++[查询Job状态(1.0.0)-业务面](https://support.huaweicloud.com/api-ges/ges_03_0037.html)++。 **取值范围**： 不涉及。                                           |
| jobType      | Integer | **参数解释**： 任务类型。请求失败时，字段为空。 **取值范围**： 不涉及。                                                                                                                                                                                            |
   
#### 请求示例
- 请求示例1，异步任务的执行结果导出到OBS文件，导出路径为demo_movie/，导出文件名louvain，导出后删除原job任务。
  ```
  POST /ges/v1.0/{project_id}/graphs/{graph_name}/jobs/{job_id}/action?action_id=export-result
  {
      "exportPath": "demo_movie/",
      "fileName": "louvain",
      "erase":  true,
      "obsParameters": {
          "accessKey": "xxxx",
          "secretKey": "xxxx"
      }
  }
  ```
  
- 请求示例2，异步任务的执行结果导出到OBS文件，导出路径为demo_movie/，导出文件名louvain，默认关闭分页，按页导出时，每个文件最大行数100000。
  ```
  POST /ges/v1.0/{project_id}/graphs/{graph_name}/jobs/{job_id}/action?action_id=export-result
  {
      "exportPath": "demo_movie/",
      "fileName": "louvain",
      "paginate":{
      "enable":true,
      "numThread":2,
      "rowCountPerFile":100000,
      },
      "obsParameters": {
          "accessKey": "xxxx",
          "secretKey": "xxxx"
      }
  }
  ```
  ![](https://support.huaweicloud.com/api-ges/public_sys-resources/note_3.0-zh-cn.png)
  目前Cypher只支持普通值类型（如属性值、数字、字符串等）导出，对于复合值类型（如列表、Map）和点边对象暂不支持导出。例如：
  - 下列语句的结果可以正常导出： match (n) return id(n) limit 10
    match (n) return n.age, n.occupation
    match (n)-\[r\]-\>(m) return n.Rating limit 10
    unwind \[1,2,3\] as p return p
    
  
  
  
  - 下列语句的结果，由于结果中包含对象或者复合值类型，导出的txt会包含空值或者空行： return \[1,2,3\], {a:1}
    match (n) return n limit 10
    match (n)-\[r\]-\>(m) return r limit 10
    
    
 
#### 响应示例
**状态码： 200**
成功响应示例
```
Http Status Code: 200
{
    "jobId": "2aa37d87-fb5a-44c4-81a1-c3876247d1cf000003836",
    "jobType": 15
}
```
**状态码： 400**
失败响应示例
```
Http Status Code: 400
{
    "jobId": "2aa37d87-fb5a-44c4-81a1-c3876247d1cf000003836",
    "jobType": 15
}
```
#### 状态码
| 返回值                       | 说明      |
|:---|:---|
| 400 Bad Request           | 请求错误。   |
| 401 Unauthorized          | 鉴权失败。   |
| 403 Forbidden             | 没有操作权限。 |
| 404 Not Found             | 找不到资源。  |
| 500 Internal Server Error | 服务内部错误。 |
| 503 Service Unavailable   | 服务不可用。  |
   
#### 错误码
请参见[错误码](https://support.huaweicloud.com/api-ges/ges_03_0110.html)。
#### 导出txt文件格式
1. 算法结果举例，例如Louvain.txt内容如下：
   ```
   # modularity: 0.4269691347613425,
   #community_num: 4,
   #runtime: 0.003784,
   #data_total_size: 34
   #community:
   1,1
   2,1
   …
   ```
   
2. Cypher结果举例如下：
   - 示例一 示例语句：
     ```
     match (n:user)-[r]->(m:movie) return id(n),n.Name, n.Occupation, n.Age,r.Score,m.ChineseTitle
     ```
     示例结果：
     ```
     #data_total_size:1209
     #data_return_size:1209
     #data_offset:0
     #records:
     Vivian,薇薇安,artist,25-34,5,致命武器
     Vivian,薇薇安,artist,25-34,4,抚养亚历桑纳
     Mercedes,默西迪丝,K-12 student,Under 18,3,致命武器
     Mercedes,默西迪丝,K-12 student,Under 18,3,勇闯夺命岛
     …
     ```
     
   
   - 示例二 示例语句：
     ```
     match (n)-->(m) where id(n)='Vivian' return labels(m),count(*)
     ```
     示例结果：
     ```
     #data_total_size:2
     #data_return_size:2
     #data_offset:0
     #records:
     user,5
     movie,2
     ```
     
    
 
