

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

# Blazegraph에서 Amazon Neptune으로의 마이그레이션
<a name="migrating-from-blazegraph"></a>

오픈 소스 [Blazegraph](https://blazegraph.com/) RDF 트리플스토어에 그래프가 있는 경우 다음 단계를 사용하여 그래프 데이터를 Amazon Neptune으로 마이그레이션할 수 있습니다.
+ *AWS 인프라를 프로비저닝합니다.* 먼저 AWS CloudFormation 템플릿을 사용하여 필요한 Neptune 인프라를 프로비저닝합니다([Neptune 클러스터 생성](get-started-create-cluster.md) 참조).
+ *Blazegraph에서 데이터를 내보냅니다.* Blazegraph에서 데이터를 내보내는 두 가지 주요 방법이 있습니다. 하나는 SPARQL CONSTRUCT 쿼리를 사용하는 것이고 다른 하나는 Blazegraph 내보내기 유틸리티를 사용하는 것입니다.
+ *데이터를 Neptune으로 가져옵니다.* 그런 다음 [Neptune Workbench](graph-notebooks.md)와 [Neptune 대량 로더](bulk-load.md)를 사용하여 내보낸 데이터 파일을 Neptune으로 로드할 수 있습니다.

이 접근 방식은 일반적으로 다른 RDF 트리플 스토어 데이터베이스에서 마이그레이션하는 경우에도 적용할 수 있습니다.

## Blazegraph와 Neptune의 호환성
<a name="migrating-from-blazegraph-compatibility"></a>

그래프 데이터를 Neptune으로 마이그레이션하기 전에 Blazegraph와 Neptune 사이에 몇 가지 중요한 차이점이 있다는 점을 알고 있어야 합니다. 이러한 차이로 인해 쿼리, 애플리케이션 아키텍처 또는 둘 다를 변경해야 하거나 마이그레이션이 불가능할 수도 있습니다.
+ **`Full-text search`** - Blazegraph에서는 Apache Solr과의 통합을 통해 내부 전체 텍스트 검색 또는 외부 전체 텍스트 검색 기능을 사용할 수 있습니다. 이 두 기능 중 하나를 사용하는 경우 Neptune이 지원하는 전체 텍스트 검색 기능에 대한 최신 업데이트를 계속 확인하세요. [Neptune 전체 텍스트 검색](full-text-search.md)을(를) 참조하세요.
+ **`Query hints`** - Blazegraph와 Neptune은 모두 쿼리 힌트라는 개념을 사용하여 SPARQL을 확장합니다. 마이그레이션하는 동안 사용하는 모든 쿼리 힌트를 마이그레이션해야 합니다. Neptune이 지원하는 최신 쿼리 힌트에 대한 자세한 내용은 [SPARQL 쿼리 힌트](sparql-query-hints.md)를 참조하세요.
+ **추론** - Blazegraph는 트리플 모드에서는 구성 가능한 옵션으로 추론을 지원하지만 쿼드 모드에서는 지원하지 않습니다. Neptune은 아직 추론을 지원하지 않습니다.
+ **지리공간 검색** - Blazegraph는 지리공간 지원을 가능하게 하는 네임스페이스 구성을 지원합니다. 이 기능은 Neptune에서는 아직 사용할 수 없습니다.
+ **멀티테넌시** - Blazegraph는 단일 데이터베이스 내에서 멀티테넌시를 지원합니다. Neptune에서는 데이터를 명명된 그래프에 저장하고 SPARQL 쿼리에 USING NAMED 절을 사용하거나 각 테넌트에 대해 별도의 데이터베이스 클러스터를 생성하여 멀티테넌시를 지원합니다.
+ **페더레이션** - Neptune은 현재 프라이빗 VPC 내부, VPC 간 또는 외부 인터넷 엔드포인트와 같이 Neptune 인스턴스가 액세스할 수 있는 위치에 대한 SPARQL 1.1 페더레이션을 지원합니다. 특정 설정 및 필요한 페더레이션 엔드포인트에 따라 일부 추가 네트워크 구성이 필요할 수 있습니다.
+ **Blazegraph 표준 확장 프로그램** - Blazegraph에는 SPARQL 및 REST API 표준에 대한 여러 확장이 포함되어 있지만 Neptune은 표준 사양 자체와만 호환됩니다. 이렇게 하려면 애플리케이션을 변경해야 하거나 마이그레이션이 어려울 수 있습니다.

## Neptune을 위한 AWS 인프라 프로비저닝
<a name="migrating-from-blazegraph-provisioning"></a>

AWS Management Console 또는 AWS CLI를 통해 필요한 AWS 인프라를 수동으로 구성할 수 있지만, 아래 설명과 같이 CloudFormation 템플릿을 대신 사용하는 것이 더 편리한 경우가 많습니다.

**CloudFormation 템플릿을 사용하여 Neptune을 프로비저닝:**

1. [를 사용하여 Amazon Neptune 클러스터 생성 AWS CloudFormation](get-started-cfn-create.md)로 이동합니다.

1. 원하는 리전의 **스택 시작**을 선택합니다.

1. 필수 파라미터(스택 이름 및 `EC2SSHKeyPairName`)를 설정합니다. 또한 마이그레이션 프로세스를 쉽게 수행할 수 있도록 다음과 같은 선택적 파라미터를 설정합니다.
   + `AttachBulkloadIAMRoleToNeptuneCluster`를 true로 설정합니다. 이 파라미터를 사용하면 적절한 IAM 역할을 생성하고 클러스터에 연결하여 데이터를 대량으로 로드할 수 있습니다.
   + `NotebookInstanceType`을 선호 인스턴스 유형으로 설정합니다. 이 파라미터는 Neptune으로 대량 로드를 실행하고 마이그레이션을 검증하는 데 사용하는 Neptune 통합 문서를 생성합니다.

1. **다음**을 선택합니다.

1. 원하는 다른 스택 옵션을 설정합니다.

1. **다음**을 선택합니다.

1. 옵션을 검토하고 두 확인란을 모두 선택하여 AWS CloudFormation에 추가 기능이 필요할 수 있음을 확인합니다.

1. **스택 생성**을 선택합니다.

이 스택 생성 프로세스는 몇 분 정도 걸릴 수 있습니다.

## Blazegraph에서 데이터 내보내기
<a name="migrating-from-blazegraph-exporting"></a>

다음 단계는 [Neptune 벌크 로더와 호환되는 형식](bulk-load-tutorial-format-rdf.md)으로 Blazegraph에서 데이터를 내보내는 것입니다.

Blazegraph에 데이터가 저장되는 방식(트리플 또는 쿼드)과 사용 중인 명명된 그래프 수에 따라 Blazegraph에서 내보내기 프로세스를 여러 번 수행하고 여러 데이터 파일을 생성해야 할 수 있습니다.
+ 데이터가 트리플로 저장되는 경우 이름이 지정된 각 그래프에 대해 내보내기를 한 번 실행해야 합니다.
+ 데이터가 쿼드로 저장된 경우 N-Quads 형식으로 데이터를 내보내거나 이름이 지정된 각 그래프를 트리플 형식으로 내보낼 수 있습니다.

아래에서는 단일 네임스페이스를 N-Quads로 내보내는 것으로 가정하지만 추가 네임스페이스나 원하는 내보내기 형식에 대해 이 프로세스를 반복할 수 있습니다.

마이그레이션 중에 Blazegraph를 온라인 상태로 유지하고 사용할 수 있도록 하려면 SPARQL CONSTRUCT 쿼리를 사용하세요. 이를 위해서는 액세스 가능한 SPARQL 엔드포인트가 있는 Blazegraph 인스턴스를 설치, 구성 및 실행해야 합니다.

Blazegraph가 온라인 상태일 필요가 없는 경우 [BlazeGraph 내보내기 유틸리티](https://github.com/blazegraph/database/wiki/DataMigration#export)를 사용하세요. 이렇게 하려면 Blazegraph를 다운로드해야 하며, 데이터 파일 및 구성 파일에 액세스할 수 있어야 하지만 서버를 실행할 필요는 없습니다.

### SPARQL CONSTRUCT를 사용하여 Blazegraph에서 데이터 내보내기
<a name="migrating-from-blazegraph-sparql-construct"></a>

SPARQL CONSTRUCT는 지정된 쿼리 템플릿과 일치하는 RDF 그래프를 반환하는 SPARQL의 기능입니다. 이 사용 사례에서는 다음과 같은 쿼리를 사용하여 데이터를 한 번에 하나의 네임스페이스씩 내보내는 데 사용합니다.

```
CONSTRUCT WHERE { hint:Query hint:analytic "true" . hint:Query hint:constructDistinctSPO "false" . ?s ?p ?o }
```

이 데이터를 내보내는 데 사용할 수 있는 다른 RDF 도구가 있지만 이 쿼리를 실행하는 가장 쉬운 방법은 Blazegraph에서 제공하는 REST API 엔드포인트를 사용하는 것입니다. 다음 스크립트는 Python(3.6\$1) 스크립트를 사용하여 데이터를 N-Quads로 내보내는 방법을 보여줍니다.

```
import requests

# Configure the URL here: e.g. http://localhost:9999/sparql
url = "http://localhost:9999/sparql"
payload = {'query': 'CONSTRUCT WHERE { hint:Query hint:analytic "true" . hint:Query hint:constructDistinctSPO "false" . ?s ?p ?o }'}
# Set the export format to be n-quads
headers = {
'Accept': 'text/x-nquads'
}
# Run the http request
response = requests.request("POST", url, headers=headers, data = payload, files = [])
#open the file in write mode, write the results, and close the file handler
f = open("export.nq", "w")
f.write(response.text)
f.close()
```

데이터가 트리플로 저장되는 경우 [Blazegraph GitHub 리포지토리](https://github.com/blazegraph/database/wiki/REST_API#rdf-data)에 지정된 값을 사용하여 적절한 형식(N-Triples, RDF/XML 또는 Turtle)으로 데이터를 내보내려면 `Accept` 헤더 파라미터를 변경해야 합니다.

### Blazegraph 내보내기 유틸리티를 사용하여 데이터 내보내기
<a name="migrating-from-blazegraph-export-utility"></a>

Blazegraph에는 데이터를 내보내는 유틸리티 메서드, 즉 `ExportKB` 클래스가 포함되어 있습니다. `ExportKB`는 Blazegraph에서 데이터를 쉽게 내보낼 수 있지만 이전 방법과 달리 내보내기가 실행되는 동안 서버가 오프라인 상태여야 합니다. 따라서 마이그레이션 중에 Blazegraph를 오프라인으로 전환하거나 데이터 백업에서 마이그레이션이 발생할 수 있는 경우에 사용하기에 이상적인 방법입니다.

Blazegraph가 설치되어 있지만 실행되지 않는 컴퓨터의 Java 명령줄에서 유틸리티를 실행합니다. 이 명령을 실행하는 가장 쉬운 방법은 GitHub에 있는 최신 [blazegraph.jar](https://github.com/blazegraph/database/releases/download/BLAZEGRAPH_2_1_6_RC/blazegraph.jar) 릴리스를 다운로드하는 것입니다. 이 명령을 실행하려면 몇 가지 파라미터가 필요합니다.
+ **`log4j.primary.configuration`** - log4j 속성 파일의 위치입니다.
+ **`log4j.configuration`** - log4j 속성 파일의 위치입니다.
+ **`output`** - 내보낸 데이터의 출력 디렉터리입니다. 파일은 지식 베이스에 설명된 대로 이름이 지정된 하위 디렉토리에 `tar.gz`로 위치합니다.
+ **`format`** - 원하는 출력 형식 뒤에 `RWStore.properties` 파일 위치가 표시됩니다. 트리플로 작업하는 경우 `-format` 파라미터를 `N-Triples`, `Turtle`, 또는 `RDF/XML`로 변경해야 합니다.

예를 들어 Blazegraph 저널 파일과 속성 파일이 있는 경우 다음 코드를 사용하여 데이터를 N-Quads로 내보냅니다.

```
java -cp blazegraph.jar \
    com.bigdata.rdf.sail.ExportKB \
    -outdir ~/temp/ \
    -format N-Quads \
    ./RWStore.properties
```

내보내기에 성공하면 다음과 같은 출력이 표시됩니다.

```
Exporting kb as N-Quads on /home/ec2-user/temp/kb
Effective output directory: /home/ec2-user/temp/kb
Writing /home/ec2-user/temp/kb/kb.properties
Writing /home/ec2-user/temp/kb/data.nq.gz
Done
```

## Amazon Simple Storage Service(S3) 버킷을 생성하고 내보낸 데이터를 버킷에 복사합니다.
<a name="migrating-from-blazegraph-s3-bucket"></a>

Blazegraph에서 데이터를 내보낸 후에는 Neptune 벌크 로더가 데이터를 가져오는 데 사용할 대상 Neptune DB 클러스터와 동일한 리전에 Amazon Simple Storage Service(S3) 버킷을 생성합니다.

Amazon S3 버킷을 생성하는 방법에 대한 지침은 [S3 버킷을 생성하려면 어떻게 해야 하나요?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 단원을 참조하세요. [Amazon Simple Storage Service 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/) 및 [Amazon Simple Storage Service 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)의 [버킷 생성 예제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-get-location-example.html)를 참조하세요.

새 Amazon S3 버킷으로 내보낸 데이터 파일을 복사하는 방법에 대한 지침은 Amazon [Simple Storage Service 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)의 [버킷에 객체 업로드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.html) 또는 [AWS CLI를 통한 상위 수준(s3) 명령 사용](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html)을 참조하세요. 다음과 같은 Python 코드를 사용하여 파일을 하나씩 복사할 수도 있습니다.

```
import boto3

region = 'region name'
bucket_name = 'bucket name'
s3 = boto3.resource('s3')
s3.meta.client.upload_file('export.nq', bucket_name, 'export.nq')
```

## Neptune 벌크 로더를 사용하여 데이터를 Neptune으로 가져오기
<a name="migrating-from-blazegraph-import-data"></a>

Blazegraph에서 데이터를 내보내고 Amazon S3 버킷으로 복사한 후에는 데이터를 Neptune으로 가져올 준비가 된 것입니다. Neptune에는 SPARQL을 사용하여 로드 작업을 수행하는 것보다 더 빠르고 오버헤드가 적은 벌크 로더가 있습니다. 대량 로더 프로세스는 로더 엔드포인트 API를 호출하여 식별된 S3 버킷에 저장된 데이터를 Neptune으로 로드함으로써 시작됩니다.

로더 REST 엔드포인트를 직접 호출하여 이 작업을 수행할 수 있지만 대상 Neptune 인스턴스가 실행되는 프라이빗 VPC에 액세스할 수 있어야 합니다. Bastion Host와 해당 시스템에 SSH를 설정하고 cURL 명령을 실행할 수 있지만 [Neptune Workbench](graph-notebooks.md)를 사용하는 것이 더 쉽습니다.

Neptune Workbench는 Amazon SageMaker 노트북으로 실행되는 사전 구성된 Jupyter Notebook으로, 여러 가지 Neptune 전용 노트북 매직이 설치되어 있습니다. 이러한 매직은 클러스터 상태 확인, SPARQL 및 Gremlin 순회 실행, 대량 로딩 작업 실행과 같은 일반적인 Neptune 작업을 단순화합니다.

대량 로드 프로세스를 시작하려면 [Neptune 로더 명령](load-api-reference-load.md) 실행 가능한 인터페이스를 제공하는 `%load` 매직을 사용하세요. 

1. AWS Management Console에 로그인한 다음 [https://console.aws.amazon.com/neptune/home](https://console.aws.amazon.com/neptune/home)에서 Amazon Neptune 콘솔을 엽니다.

1. **aws-neptune-blazegraph-to-neptune**을 선택합니다.

1. **노트북 열기**를 선택합니다.

1. 실행 중인 Jupyter 인스턴스에서 기존 노트북을 선택하거나 Python 3 커널을 사용하여 새 노트북을 만드세요.

1. 노트북에서 셀을 열고, `%load`를 입력하고 셀을 실행합니다.

1. 벌크 로더의 파라미터를 설정합니다.

   1. **소스**에는 가져올 소스 파일의 위치를 입력합니다. `s3://{bucket_name}/{file_name}` 

   1. **형식**에서 적절한 형식(이 예에서는 `nquads`)을 선택합니다.

   1. **Load ARN**에 `IAMBulkLoad` 역할에 대한 ARN을 입력합니다. 이 정보는 IAM 콘솔의 **역할** 아래에 있습니다.

1. **제출**을 선택합니다.

결과에는 요청의 상태가 포함됩니다. 대량 로드는 오래 실행되는 프로세스인 경우가 많으므로 응답은 로드가 완료되었음을 의미하는 것이 아니라 시작되었다는 의미입니다. 이 상태 정보는 작업이 완료되었다고 보고될 때까지 주기적으로 업데이트됩니다.

**참고**  
이 정보는 블로그 게시물인 [클라우드로 이동: Blazegraph를 Amazon Neptune으로 마이그레이션](https://aws.amazon.com/blogs/database/moving-to-the-cloud-migrating-blazegraph-to-amazon-neptune/)에서도 확인할 수 있습니다.