

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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>
  ```

**참고**  
많은 데이터를 로드해야 하는 경우 UPDATE LOAD 대신 Neptune 대량 로더를 사용하는 것이 좋습니다. 대량 로더에 대한 자세한 내용은 [Amazon Neptune 대량 로더를 사용하여 데이터 수집](bulk-load.md) 섹션을 참조하세요.

`SPARQL UPDATE LOAD`를 사용하여 Amazon S3에서 직접 데이터를 로드하거나 자체 호스팅한 웹 서버에서 가져온 파일에서 데이터를 로드할 수 있습니다. 로드할 리소스는 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 UPDATE LOAD를 사용할 때 Amazon S3에 IAM 역할을 전달할 수 없으므로, 문제의 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)}}
```

그러면 생성된 사전 서명된 URL을 `LOAD` 명령에 사용할 수 있습니다.

```
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)을 사용하여 액세스하는 버킷에 대해서만 작동합니다.

 아래와 같이 프라이빗 Amazon S3 버킷에서 로드하도록 웹 프록시 서버를 설정할 수도 있습니다.

**웹 서버에서 SPARQL UPDATE LOAD를 사용하여 파일을 Neptune에 로드**

1. Neptune 및 로드할 파일을 호스팅하는 VPC 내에서 실행하는 시스템에 웹 서버를 설치합니다. 예를 들어 Amazon Linux를 사용하는 경우 다음과 같이 Apache를 설치할 수 있습니다.

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

1. 로드할 RDF 파일 콘텐츠의 MIME 유형을 정의합니다. SPARQL은 웹 서버에서 보낸 `Content-type` 헤더를 사용하여 콘텐츠의 입력 형식을 결정하므로 웹 서버에 적합한 MIME 유형을 정의해야 합니다.

   예를 들어 다음 파일 확장명을 사용하여 파일 형식을 식별한다고 가정하겠습니다.
   + NTriples에 대해 `.nt`
   + NQuads에 대해 `.nq`
   + Trig에 대해 `.trig`
   + RDF/XML에 대해 `.rdf`
   + Turtle에 대해 `.ttl`
   + N3에 대해 `.n3`
   + JSON-LD에 대해 `.jsonld`

   Apache 2를 웹 서버로 사용하는 경우 `/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 유형의 매핑이 작동하는지 확인합니다. 웹 서버가 작동하고 실행 중이며 RDF 파일을 선택한 형식으로 호스팅하면 로컬 호스트에서 웹 서버로 요청을 보내 구성을 테스트할 수 있습니다.

   예를 들어 다음과 같이 요청을 보낼 수 있습니다.

   ```
   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`를 사용하면 로드 중인 소스 파일이 클 때 웹 서버에서 시간 초과를 트리거할 수 있습니다. Neptune은 스트리밍되는 파일 데이터를 처리하고 서버에 구성된 제한 시간보다 오래 걸릴 수 있는 큰 파일을 처리합니다. 이로 인해 서버가 연결을 종료하여 Neptune의 스트림에서 예기치 않은 EOF가 발생하면 다음과 같은 오류 메시지가 나타날 수 있습니다.  

```
{
  "detailedMessage":"Invalid syntax in the specified file",
  "code":"InvalidParameterException"
}
```
이 메시지가 나타나는데 소스 파일에 잘못된 구문이 포함되어 있지 않은 경우 웹 서버의 시간 초과 설정을 늘려 보십시오. 서버에서 디버그 로그를 활성화하고 시간 초과를 찾아 문제를 진단할 수도 있습니다.