

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

# 使用 SPARQL UPDATE LOAD 将数据导入到 Neptune
<a name="sparql-api-reference-update-load"></a>

SPARQL UPDATE LOAD 命令的语法在 [SPARQL 1.1 更新建议](https://www.w3.org/TR/sparql11-update/#load)中指定：

```
LOAD SILENT {{(URL of data to be loaded)}} INTO GRAPH {{(named graph into which to load the data)}}
```
+ **`SILENT`** –（*可选*）即使在处理过程中出现错误，也使操作返回成功。

  当单个事务包含多个语句（例如 `"LOAD ...; LOAD ...; UNLOAD ...; LOAD ...;"`）并且即使某些远程数据无法处理也希望事务完成时，这可能很有用。
+ {{URL of data to be loaded}}—（*必需*）指定包含要加载到图表中的数据的远程数据文件。

  远程文件必须具有以下扩展名之一：
  + `.nt`对于 NTriples。
  + `.nq`对于 NQuads。
  + `.trig` 表示 Trig。
  + `.rdf` 表示 RDF/XML。
  + `.ttl` 表示 Turtle。
  + `.n3` 表示 N3。
  + `.jsonld` 表示 JSON-LD。
+ **`INTO GRAPH`**{{(named graph into which to load the data)}}—（*可选*）指定应将数据加载到的图表。

  Neptune 将每个三元组与一个命名图形相关联。您可以使用后备命名图形 URI `http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph` 来指定默认的命名图形，如下所示：

  ```
  INTO GRAPH <http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph>
  ```

**注意**  
当您需要加载大量数据时，我们建议您使用 Neptune 批量加载程序，而不是 UPDATE LOAD。有关批量加载程序的更多信息，请参阅[使用 Amazon Neptune 批量加载程序摄取数据](bulk-load.md)。

您可以使用 `SPARQL UPDATE LOAD` 直接从 Amazon S3 加载数据，或者从通过自行托管 Web 服务器获取的文件加载数据。要加载的资源必须与 Neptune 服务器位于相同区域，并且资源的端点必须在 VPC 中得到允许。有关创建 Amazon S3 端点的信息，请参阅[创建 Amazon S3 VPC 端点](bulk-load-data.md#bulk-load-prereqs-s3)。

一切都`SPARQL UPDATE LOAD` URIs 必须从开始`https://`。这包括亚马逊 S3 URLs。

与 Neptune 批量加载程序相反，对 `SPARQL UPDATE LOAD` 的调用是完全事务性的。

**使用 SPARQL UPDATE LOAD 直接将文件从 Amazon S3 加载到 Neptune**

由于 Neptune 不允许您在使用 SPARQL UPDATE LOAD 时将 IAM 角色传递给 Amazon S3，因此所讨论的 Amazon S3 桶必须是公有的，或者您必须在 LOAD 查询中使用[预签名的 Amazon S3 URL](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html)。

要为 Amazon S3 文件生成预签名 URL，您可以使用如下 AWS CLI 命令：

```
aws s3 presign --expires-in {{(number of seconds)}} s3://{{(bucket name)}}/{{(path to file of data to load)}}
```

然后，您就可以在 `LOAD` 命令中使用生成的预签名 URL：

```
curl https://{{(a Neptune endpoint URL)}}:8182/sparql \
  --data-urlencode 'update=load {{(pre-signed URL of the remote Amazon S3 file of data to be loaded)}} \
                           into graph {{(named graph)}}'
```

有关更多信息，请参阅[身份验证请求：使用查询参数](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html)。[Boto3 文档](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html)中介绍了如何使用 Python 脚本生成预签名 URL。

此外，要加载的文件的内容类型必须正确设置。

1. 将文件上传到 Amazon S3 时，使用 `-metadata` 参数设置文件的内容类型，如下所示：

   ```
   aws s3 cp test.nt s3://{{bucket-name/my-plain-text-input}}/test.nt --metadata Content-Type=text/plain
   aws s3 cp test.rdf s3://{{bucket-name/my-rdf-input}}/test.rdf --metadata Content-Type=application/rdf+xml
   ```

1. 确认媒体类型信息实际存在。运行：

   ```
   curl -v {{bucket-name/folder-name}}
   ```

   此命令的输出应显示您在上传文件时设置的媒体类型信息。

1. 然后，您可以使用 `SPARQL UPDATE LOAD` 命令将这些文件导入到 Neptune：

   ```
   curl https://{{your-neptune-endpoint}}:{{port}}/sparql \
     -d "update=LOAD <https://s3.amazonaws.com/{{bucket-name}}/{{my-rdf-input/test.rdf}}>"
   ```

以上步骤仅适用于公有 Amazon S3 桶或您使用 LOAD 查询中的[预签名的 Amazon S3 URL](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html) 访问的桶。

 您还可以设置 Web 代理服务器，以便从私有 Amazon S3 桶中加载，如下所示：

**使用 Web 服务器，通过 SPARQL UPDATE LOAD 将文件加载到 Neptune 中**

1. 在运行于 VPC 中且托管了 Neptune 和要加载的文件的计算机上安装 Web 服务器。例如，使用 Amazon Linux，您可以如下所示安装 Apache：

   ```
   sudo yum install httpd mod_ssl
   sudo /usr/sbin/apachectl start
   ```

1. 定义您将要加载的 RDF 文件内容的 MIME 类型。SPARQL 使用 Web 服务器发送的 `Content-type` 标头确定内容的输入格式，因此您必须为 Web 服务器定义相关的 MIME 类型。

   例如，假设您使用以下文件扩展名来标识文件格式：
   + `.nt`对于 NTriples。
   + `.nq`对于 NQuads。
   + `.trig` 表示 Trig。
   + `.rdf` 表示 RDF/XML。
   + `.ttl` 表示 Turtle。
   + `.n3` 表示 N3。
   + `.jsonld` 表示 JSON-LD。

   如果您使用 Apache 2 作为 Web 服务器，您将编辑文件 `/etc/mime.types` 并添加以下类型：

   ```
    text/plain nt
    application/n-quads nq
    application/trig trig
    application/rdf+xml rdf
    application/x-turtle ttl
    text/rdf+n3 n3
    application/ld+json jsonld
   ```

1. 确认 MIME 类型映射可以正常使用。在您启动并运行 Web 服务器并托管了所选格式的 RDF 文件之后，您可以通过从本地主机向 Web 服务器发送请求来测试配置。

   例如，您可以如下所示发送请求：

   ```
   curl -v http://localhost:80/test.rdf
   ```

   然后，在 `curl` 的详细输出中您应看到如下所示的行：

   ```
   Content-Type: application/rdf+xml
   ```

   这指示已成功定义内容类型映射。

1. 现在，您已准备好使用 SPARQL UPDATE 命令加载数据：

   ```
   curl https://{{your-neptune-endpoint}}:{{port}}/sparql \
       -d "update=LOAD <http://{{web_server_private_ip}}:80/test.rdf>"
   ```

**注意**  
当加载的源文件很大时，在 Web 服务器上使用 `SPARQL UPDATE LOAD` 可能会触发超时。Neptune 在文件数据流式传入时进行处理，对于大文件，其用时可能会超过在服务器上配置的超时。这反过来可能会导致服务器关闭连接，使得 Neptune 在流中遇到意外的 EOF 时出现以下错误消息：  

```
{
  "detailedMessage":"Invalid syntax in the specified file",
  "code":"InvalidParameterException"
}
```
如果您收到此消息，但不认为自己的源文件包含无效语法，请尝试增加 Web 服务器上的超时设置。您还可以通过在服务器上启用调试日志并查看超时来诊断问题。