

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 示例：将数据加载到 Neptune 数据库实例中
<a name="bulk-load-data"></a>

此示例演示如何将数据加载到 Amazon Neptune 中。除非另有说明，否则您必须在与 Neptune 数据库实例相同的 Amazon Virtual Private Cloud (VPC) 中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例中执行这些步骤。

## 数据加载示例的先决条件
<a name="bulk-load-tutorial-prereqs"></a>

在开始之前，您必须具有以下内容：
+ 一个 Neptune 数据库实例。

  有关启动 Neptune 数据库实例的信息，请参阅[创建 Amazon Neptune 集群](get-started-create-cluster.md)。
+ 将数据文件放入其中的 Amazon Simple Storage Service (Amazon S3) 桶。

  您可以使用现有存储段。如果没有 S3 桶，请参阅 *[Amazon S3 入门指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)*中的[创建桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)。
+ 为以 Neptune 加载程序支持的格式之一加载的数据绘制图形：

  如果您使用 Gremlin 来查询图表，Neptune 可以加载 comma-separated-values (`CSV`) 格式的数据，如中所述。[Gremlin 加载数据格式](bulk-load-tutorial-format-gremlin.md)

  如果您使用 openCypher 查询图形，Neptune 还可以按特定于 openCypher 的 `CSV` 格式加载数据，如[openCypher 数据的加载格式](bulk-load-tutorial-format-opencypher.md)中所述。

  如果您使用 SPARQL，则 Neptune 可加载采用大量 RDF 格式的数据，如[RDF 加载数据格式](bulk-load-tutorial-format-rdf.md)中所述。
+ Neptune 数据库实例要代入的 IAM 角色，此角色具有允许访问 S3 桶中的数据文件的 IAM policy。此策略必须授予读取和列出权限。

   有关创建对 Amazon S3 具有访问权限的角色，然后将其与 Neptune 集群关联的信息，请参阅[先决条件：IAM 角色和 Amazon S3 访问权限](bulk-load-tutorial-IAM.md)。
**注意**  
Neptune `Load` API 只需要对数据文件的读取访问权限。IAM policy 不需要允许对整个桶的写入访问权限或访问权限。
+ Amazon S3 VPC 端点。想要了解更多信息，请参阅[创建 Amazon S3 VPC 端点](#bulk-load-prereqs-s3)部分。

### 创建 Amazon S3 VPC 端点
<a name="bulk-load-prereqs-s3"></a>

Neptune 加载程序需要 Amazon S3 的 VPC 端点。

**设置 Amazon S3 访问权限**

1. 登录 AWS 管理控制台 并打开 Amazon VPC 控制台，网址为[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在左侧导航窗格中，选择**终端节点**。

1. 选择**创建端点**。

1. 选择 **Service Name (服务名称)** `com.amazonaws.{{region}}.s3`。
**注意**  
如果此处的区域不正确，请确保控制台区域正确。

1. 选择包含您的 Neptune 数据库实例的 VPC。

1. 选中与子网 (与集群相关) 关联的路由表旁边的复选框。如果只有一个路由表，则必须选中该框。

1. 选择**创建端点**。

有关创建端点的信息，请参阅《Amazon VPC 用户指南》**中的 [VPC 端点](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html#create-vpc-endpoint)。有关 VPC 端点的限制的信息，请参阅 [Amazon S3 的 VPC 端点](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-s3.html)。

**将数据加载到 Neptune 数据库实例中**

1. 将数据文件复制到 Amazon S3 桶。S3 存储桶必须与加载数据的集群位于同一 AWS 区域。

   您可以使用以下 AWS CLI 命令将文件复制到存储桶。
**注意**  
此命令不需要从 Amazon EC2 实例运行。

   ```
   aws s3 cp {{data-file-name}} s3://{{bucket-name}}/{{object-key-name}}
   ```
**注意**  
在 Amazon S3 中，**对象键名称**是文件的整个路径，其中包含文件名。  
*示例：*在命令 `aws s3 cp datafile.txt s3://examplebucket/mydirectory/datafile.txt` 中，对象键名称为 **`mydirectory/datafile.txt`**。

   或者，您可以使用将文件上传 AWS 管理控制台 到 S3 存储桶。在上打开 Amazon S3 控制台 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)，然后选择一个存储桶。在左上角，选择 **Upload (上传)** 以上传文件。

1. 从命令行窗口中，使用端点、Amazon S3 路径、格式和 IAM 角色 ARN 的正确值输入以下内容，以运行 Neptune 加载程序。

   `format` 参数可以是下列任意值：`csv`（对于 Gremlin），`opencypher`（对于 openCypher），或者 `ntriples`、`nquads`、`turtle` 和 `rdfxml`（对于 RDF）。有关其他参数的信息，请参阅[Neptune 加载程序命令](load-api-reference-load.md)。

   有关查找 Neptune 数据库实例的主机名的信息，请参阅[连接到 Amazon Neptune 端点](feature-overview-endpoints.md)部分。

   区域参数必须与集群和 S3 存储桶的区域匹配。

亚马逊 Neptune 在以下 AWS 地区上市：
   + 美国东部（弗吉尼亚州北部）：`us-east-1`
   + 美国东部（俄亥俄州）：`us-east-2`
   + 美国西部（北加利福尼亚）：`us-west-1`
   + 美国西部（俄勒冈州）：`us-west-2`
   + 加拿大（中部）：`ca-central-1`
   + 加拿大西部（卡尔加里）：`ca-west-1`
   + 南美洲（圣保罗）：`sa-east-1`
   + 欧洲地区（斯德哥尔摩）：`eu-north-1`
   + 欧洲（西班牙）：`eu-south-2`
   + 欧洲地区（爱尔兰）：`eu-west-1`
   + 欧洲地区（伦敦）：`eu-west-2`
   + 欧洲地区（巴黎）：`eu-west-3`
   + 欧洲地区（法兰克福）：`eu-central-1`
   + 中东（巴林）：`me-south-1`
   + 中东（阿联酋）：`me-central-1`
   + 以色列（特拉维夫）：`il-central-1`
   + 非洲（开普敦）：`af-south-1`
   + 亚太地区（香港）：`ap-east-1`
   + 亚太地区（东京）：`ap-northeast-1`
   + 亚太地区（首尔）：`ap-northeast-2`
   + 亚太地区（大阪）：`ap-northeast-3`
   + 亚太地区（新加坡）：`ap-southeast-1`
   + 亚太地区（悉尼）：`ap-southeast-2`
   + 亚太地区（雅加达）：`ap-southeast-3`
   + 亚太地区（墨尔本）：`ap-southeast-4`
   + 亚太地区（马来西亚）：`ap-southeast-5`
   + 亚太地区（孟买）：`ap-south-1`
   + 亚太地区（海得拉巴）：`ap-south-2`
   + 中国（北京）：`cn-north-1`
   + 中国（宁夏）：`cn-northwest-1`
   + AWS GovCloud （美国西部）：`us-gov-west-1`
   + AWS GovCloud （美国东部）：`us-gov-east-1`

------
#### [ AWS CLI ]

   ```
   aws neptunedata start-loader-job \
     --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
     --source "s3://{{bucket-name}}/{{object-key-name}}" \
     --format "{{format}}" \
     --iam-role-arn "arn:aws:iam::{{account-id}}:role/{{role-name}}" \
     --s3-bucket-region "{{region}}" \
     --no-fail-on-error \
     --parallelism "MEDIUM" \
     --no-update-single-cardinality-properties \
     --queue-request \
     --dependencies "{{load_A_id}}" "{{load_B_id}}"
   ```

   有关更多信息，请参阅《 AWS CLI 命令参考》[start-loader-job](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/start-loader-job.html)中的。

------
#### [ SDK ]

   ```
   import boto3
   from botocore.config import Config
   
   client = boto3.client(
       'neptunedata',
       endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
       config=Config(read_timeout=None, retries={'total_max_attempts': 1})
   )
   
   response = client.start_loader_job(
       source='s3://{{bucket-name}}/{{object-key-name}}',
       format='{{format}}',
       iamRoleArn='arn:aws:iam::{{account-id}}:role/{{role-name}}',
       s3BucketRegion='{{region}}',
       failOnError=False,
       parallelism='MEDIUM',
       updateSingleCardinalityProperties=False,
       queueRequest=True,
       dependencies=['{{load_A_id}}', '{{load_B_id}}']
   )
   
   print(response)
   ```

------
#### [ awscurl ]

   ```
   awscurl https://{{your-neptune-endpoint}}:{{port}}/loader \
     --region {{us-east-1}} \
     --service neptune-db \
     -X POST \
     -H 'Content-Type: application/json' \
     -d '{
           "source" : "s3://{{bucket-name}}/{{object-key-name}}",
           "format" : "{{format}}",
           "iamRoleArn" : "arn:aws:iam::{{account-id}}:role/{{role-name}}",
           "region" : "{{region}}",
           "failOnError" : "FALSE",
           "parallelism" : "MEDIUM",
           "updateSingleCardinalityProperties" : "FALSE",
           "queueRequest" : "TRUE",
           "dependencies" : ["{{load_A_id}}", "{{load_B_id}}"]
         }'
   ```

**注意**  
此示例假设您的 AWS 证书是在您的环境中配置的。{{us-east-1}}替换为 Neptune 集群的区域。

------
#### [ curl ]

   ```
   curl -X POST https://{{your-neptune-endpoint}}:{{port}}/loader \
     -H 'Content-Type: application/json' \
     -d '{
           "source" : "s3://{{bucket-name}}/{{object-key-name}}",
           "format" : "{{format}}",
           "iamRoleArn" : "arn:aws:iam::{{account-id}}:role/{{role-name}}",
           "region" : "{{region}}",
           "failOnError" : "FALSE",
           "parallelism" : "MEDIUM",
           "updateSingleCardinalityProperties" : "FALSE",
           "queueRequest" : "TRUE",
           "dependencies" : ["{{load_A_id}}", "{{load_B_id}}"]
         }'
   ```

------

   有关创建 IAM 角色并将其与 Neptune 集群关联的信息，请参阅[先决条件：IAM 角色和 Amazon S3 访问权限](bulk-load-tutorial-IAM.md)。
**注意**  
有关加载请求参数的详细信息，请参阅[Neptune 加载程序请求参数](load-api-reference-load.md#load-api-reference-load-parameters)）。简而言之：  
`source` 参数接受指向单个文件或文件夹的 Amazon S3 URI。如果指定文件夹，Neptune 将加载该文件夹中的每个数据文件。  
文件夹可包含多个顶点文件和多个边缘文件。  
URI 可以采用以下任意格式。  
`s3://{{bucket_name}}/{{object-key-name}}`
`https://s3.amazonaws.com/{{bucket_name}}/{{object-key-name}}`
`https://s3-us-east-1.amazonaws.com/{{bucket_name}}/{{object-key-name}}`
`format` 可以是下列项之一：  
Gremlin 属性图的 Gremlin CSV 格式 (`csv`)
openCypher 属性图的 openCypher CSV 格式 (`opencypher`)
RDF 的 N -Triples (`ntriples`) 格式 / SPARQL
RDF 的 N-Quads (`nquads`) 格式 / SPARQL
RDF 的 RDF/XML (`rdfxml`) 格式 / SPARQL
RDF 的 Turtle (`turtle`) 格式 / SPARQL
可选 `parallelism` 参数，您可用于限制批量加载进程中使用的线程数。它可以设置为 `LOW`、`MEDIUM`、`HIGH` 或 `OVERSUBSCRIBE`。  
将 `updateSingleCardinalityProperties` 设置为 `"FALSE"` 时，如果在为边缘或单基数顶点属性加载的源文件中提供了多个值，则加载程序将返回错误。  
如果已有加载作业正在运行，则将 `queueRequest` 设置为 `"TRUE"` 会将加载请求放入队列中。  
`dependencies` 参数使加载请求的执行取决于成功完成已放入队列中的一个或多个加载作业。

1. Neptune 加载程序将返回允许检查状态或取消加载过程的任务 `id`，例如：

   ```
   {
       "status" : "200 OK",
       "payload" : {
           "loadId" : "{{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}"
       }
   }
   ```

1. 在**步骤 3** 中输入以下命令以获取具有 `loadId` 的加载的状态：

------
#### [ AWS CLI ]

   ```
   aws neptunedata get-loader-job-status \
     --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
     --load-id {{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}
   ```

   有关更多信息，请参阅《 AWS CLI 命令参考》[get-loader-job-status](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/get-loader-job-status.html)中的。

------
#### [ SDK ]

   ```
   import boto3
   from botocore.config import Config
   
   client = boto3.client(
       'neptunedata',
       endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
       config=Config(read_timeout=None, retries={'total_max_attempts': 1})
   )
   
   response = client.get_loader_job_status(
       loadId='{{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}'
   )
   
   print(response)
   ```

------
#### [ awscurl ]

   ```
   awscurl 'https://{{your-neptune-endpoint}}:{{port}}/loader/{{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}' \
     --region {{us-east-1}} \
     --service neptune-db
   ```

**注意**  
此示例假设您的 AWS 证书是在您的环境中配置的。{{us-east-1}}替换为 Neptune 集群的区域。

------
#### [ curl ]

   ```
   curl -G 'https://{{your-neptune-endpoint}}:{{port}}/loader/{{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}'
   ```

------

   如果加载的状态列出错误，则可以请求更详细的状态和错误的列表。有关更多信息以及示例，请参阅 [Neptune 加载器 API Get-Status](load-api-reference-status.md)。

1. (可选) 取消 `Load` 任务。

   在**步骤 3** 中输入以下命令以通过任务 `id` `Delete` 加载程序任务：

------
#### [ AWS CLI ]

   ```
   aws neptunedata cancel-loader-job \
     --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
     --load-id {{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}
   ```

   有关更多信息，请参阅《 AWS CLI 命令参考》[cancel-loader-job](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/cancel-loader-job.html)中的。

------
#### [ SDK ]

   ```
   import boto3
   from botocore.config import Config
   
   client = boto3.client(
       'neptunedata',
       endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
       config=Config(read_timeout=None, retries={'total_max_attempts': 1})
   )
   
   response = client.cancel_loader_job(
       loadId='{{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}'
   )
   
   print(response)
   ```

------
#### [ awscurl ]

   ```
   awscurl 'https://{{your-neptune-endpoint}}:{{port}}/loader/{{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}' \
     --region {{us-east-1}} \
     --service neptune-db \
     -X DELETE
   ```

**注意**  
此示例假设您的 AWS 证书是在您的环境中配置的。{{us-east-1}}替换为 Neptune 集群的区域。

------
#### [ curl ]

   ```
   curl -X DELETE 'https://{{your-neptune-endpoint}}:{{port}}/loader/{{ef478d76-d9da-4d94-8ff1-08d9d4863aa5}}'
   ```

------

   `DELETE` 命令将在成功取消后返回 HTTP 代码 `200 OK`。

   不会回滚已完成加载的加载任务中文件的数据。数据仍保留在 Neptune 数据库实例中。