

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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}} – (*必要*) 指定一個遠端資料檔案，其中包含要載入至圖形的資料。

  遠端檔案必須具有下列其中一個副檔名：
  + NTriples 為 `.nt`。
  + NQuads 為 `.nq`。
  + Trig 為 `.trig`。
  + RDF/XML 為 `.rdf`。
  + Turtle 為 `.ttl`。
  + N3 為 `.n3`。
  + JSON-LD 為 `.jsonld`。
+ **`INTO GRAPH`**{{(要載入資料的具名圖形)}} – (*選用*) 指定應載入資料的圖形。

  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` URI 都必須以 `https://` 開頭。這包括 Amazon S3 URL。

與 Neptune 大量載入器相反，呼叫 `SPARQL UPDATE LOAD` 是可完全交易的。

**使用 SPARQL UPDATE LOAD 直接從 Amazon S3 將檔案載入至 Neptune**

由於 Neptune 不允許您在使用 SPARQL UPDATLOAD 時將 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. 當您使用 `-metadata` 參數將檔案上傳至 Amazon S3 時，請設定檔案的內容類型，如下所示：

   ```
   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 儲存貯體，如下所示：

**搭配 SPARQL UPDATE LOAD 使用 Web 伺服器將檔案載入至 Neptune**

1. 在 VPC 內執行的電腦上安裝 Web 伺服器，此為要載入檔案的 VPC，且是 Neptune 託管所在。例如，使用 Amazon Linux，您可能會以下列方式安裝 Apache：

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

1. 定義您要載入之 RDF 檔案內容的 MIME 類型。SPARQL 使用 Web 伺服器傳送的 `Content-type` 標頭來決定內容的輸入格式，所以您必須定義 Web 伺服器的相關 MIME 類型。

   例如，假設您使用以下副檔名來識別檔案格式：
   + NTriples 為 `.nt`。
   + NQuads 為 `.nq`。
   + Trig 為 `.trig`。
   + RDF/XML 為 `.rdf`。
   + Turtle 為 `.ttl`。
   + N3 為 `.n3`。
   + JSON-LD 為 `.jsonld`。

   如果您使用 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>"
   ```

**注意**  
使用 `SPARQL UPDATE LOAD` 可以在載入大型來源檔案時於 Web 伺服器上觸發逾時。Neptune 會在檔案資料串流輸入的同時進行處理，對大型檔案而言，所需時間可能會比伺服器上設定的逾時時間長。這樣反而可能會造成伺服器關閉連線，當 Neptune 在串流中遇到未預期的 EOF 時，可能會導致下列錯誤訊息：  

```
{
  "detailedMessage":"Invalid syntax in the specified file",
  "code":"InvalidParameterException"
}
```
如果您收到此訊息，但不認為來源檔案包含無效的語法，請嘗試增加 Web 伺服器上的逾時時間設定。您也可以透過在伺服器上啟用偵錯日誌並尋找逾時時間來診斷問題。