

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

# Amazon Neptune에서 그래프 데이터 액세스
<a name="get-started-access-graph"></a>

연결을 생성한 후 Amazon Neptune DB 클러스터와 상호 작용할 수 있습니다. 여기에는 데이터 로드, 쿼리 실행 및 기타 작업 수행이 포함됩니다. 대부분의 사용자는 `curl` 또는 `awscurl` 명령줄 도구를 활용하여 Neptune DB 클러스터와 효과적으로 통신합니다. 이러한 도구를 사용하면 요청을 보내고, 데이터를 로드하고, 그래프 데이터베이스에서 결과를 검색하여 원활한 데이터 관리 및 쿼리 기능을 촉진할 수 있습니다.

## Neptune 엔드포인트와 통신하도록 `curl` 설정
<a name="get-started-access-graph-curl"></a>

이 설명서의 여러 예제에 나와 있는 대로 [curl](https://curl.haxx.se/) 명령줄 도구는 Neptune 엔드포인트와 통신하기 위한 유용한 옵션입니다. 이 도구에 대한 자세한 내용은 [curl man 페이지](https://curl.haxx.se/docs/manpage.html) 및 *[Everything curl](https://ec.haxx.se/)* 설명서를 참조하십시오.

권장 사항이며 대다수 리전의 경우 Neptune에서 요구하는 대로 HTTPS를 사용하여 연결하려면 `curl`에서 적절한 인증서에 액세스해야 합니다. `curl` 설명서의 [SSL 인증서 확인](https://curl.haxx.se/docs/sslcerts.html)에는 이러한 인증서를 가져오는 방법과 `curl`에서 사용할 수 있는 CA(인증 기관) 인증서 스토어로 적절하게 형식을 지정하는 방법이 나와 있습니다.

이렇게 하면 `CURL_CA_BUNDLE` 환경 변수를 사용하여 이 CA 인증서 스토어의 위치를 지정할 수 있습니다. Windows에서 `curl`은 `curl-ca-bundle.crt`라는 파일에서 자동으로 이 인증서를 찾습니다. 먼저 `curl.exe`와 동일한 디렉터리에서 찾은 다음 경로의 다른 곳을 찾습니다. 자세한 내용은 [SSL Certificate Verification](https://curl.haxx.se/docs/sslcerts.html)을 참조하십시오.

`curl`이 적절한 인증서를 찾을 수 있어야 추가 파라미터 없이 HTTP 연결과 같이 HTTPS 연결을 처리할 수 있습니다. 이 설명서의 예제는 해당 시나리오를 기반으로 합니다.

## 쿼리 언어를 사용하여 Neptune DB 클러스터의 그래프 데이터 액세스
<a name="get-started-access-graph-query-langs"></a>

연결되면 Gremlin 및 openCypher 쿼리 언어를 사용하여 속성 그래프를 만들고 쿼리하거나, SPARQL 쿼리 언어를 사용하여 RDF 데이터가 포함된 그래프를 만들고 쿼리할 수 있습니다.

**Neptune에서 지원하는 그래프 쿼리 언어**
+ [Gremlin](access-graph-gremlin.md)은 속성 그래프를 위한 그래프 순회 언어입니다. Gremlin의 쿼리는 각 단계가 엣지를 따라 노드로 이어지는 개별 단계로 구성된 순회입니다. 자세한 내용은 [Apache TinkerPop](https://tinkerpop.apache.org/docs/current/reference/)의 Gremlin 설명서를 참조하세요.

  Gremlin의 Neptune 구현은 특히 Gremlin-Groovy(직렬화된 텍스트로 전송된 Gremlin 쿼리)를 사용할 때 기타 구현과 차이가 있습니다. 자세한 내용은 [Amazon Neptune에 사용되는 Gremlin 표준 규정 준수](access-graph-gremlin-differences.md) 단원을 참조하십시오.
+ [openCypher](access-graph-opencypher.md)는 속성 그래프용 선언적 쿼리 언어로, Neo4j에서 처음 개발한 후 2015년에 오픈 소스로 제공되었으며, Apache 2 오픈 소스 라이선스에 따라 [openCypher](http://www.opencypher.org/) 프로젝트에 기여했습니다. 이 구문은 [Cypher 쿼리 언어 참조(버전 9)](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf)에 문서화되어 있습니다.
+ [SPARQL](access-graph-sparql.md)은 World Wide Web Consortium(W3C)에서 표준화하고 [SPARQL 1.1 개요](https://www.w3.org/TR/sparql11-overview/) 및 [SPARQL 1.1 쿼리 언어](https://www.w3.org/TR/sparql11-query/) 사양에서 설명한 그래프 패턴 매칭을 기반으로 하는 [RDF](https://www.w3.org/2001/sw/wiki/RDF) 데이터용 선언적 쿼리 언어입니다.

**참고**  
Neptune의 속성 그래프 데이터에는 Gremlin과 openCypher를 모두 사용하여 액세스할 수 있지만, SPARQL을 사용할 수는 없습니다. 마찬가지로 SPARQL을 사용해서만 RDF 데이터에 액세스할 수 있으며, 이때 Gremlin이나 openCypher는 사용할 수 없습니다.

# Gremlin을 사용하여 Amazon Neptune에서 그래프 데이터에 액세스
<a name="get-started-graph-gremlin"></a>

Gremlin 콘솔을 사용하여 REPL(read-eval-print loop) 환경에서 TinkerPop 그래프 및 쿼리를 실험할 수 있습니다.

다음 자습서에서는 Gremlin 콘솔을 사용하여 Neptune 그래프에 버텍스, 엣지, 속성 등을 추가하는 방법을 안내하고 Neptune별 Gremlin 구현의 몇 가지 차이점을 강조합니다.

**참고**  
이 예제에서는 다음을 완료했다고 가정합니다.  
SSH를 사용하여 Amazon EC2 인스턴스에 연결했습니다.
[Neptune 클러스터 생성](get-started-create-cluster.md)에 나와 있는 대로 Neptune 클러스터를 생성했습니다.
[Gremlin 콘솔 설치](access-graph-gremlin-console.md)의 설명대로 Gremlin 콘솔을 설치했습니다.

**Gremlin 콘솔 사용**

1. 디렉터리를 Gremlin 콘솔 파일의 압축을 푼 폴더로 변경합니다.

   ```
   cd apache-tinkerpop-gremlin-console-3.7.2
   ```

1. 다음 명령을 입력하여 Gremlin 콘솔을 실행합니다.

   ```
   bin/gremlin.sh
   ```

   다음 결과가 표시됩니다.

   ```
            \,,,/
            (o o)
   -----oOOo-(3)-oOOo-----
   plugin activated: tinkerpop.server
   plugin activated: tinkerpop.utilities
   plugin activated: tinkerpop.tinkergraph
   gremlin>
   ```

   이제 `gremlin>` 프롬프트가 표시됩니다. 이 프롬프트에 나머지 단계를 입력합니다.

1. `gremlin>` 프롬프트에 다음을 입력하여 Neptune DB 인스턴스에 연결합니다.

   ```
   :remote connect tinkerpop.server conf/neptune-remote.yaml
   ```

1. `gremlin>` 프롬프트에 다음을 입력하여 원격 모드로 전환합니다. 그러면 모든 Gremlin 쿼리가 원격 연결로 전송됩니다.

   ```
   :remote console
   ```

1. **레이블 및 속성이 포함된 버텍스를 추가합니다.**

   ```
   g.addV('person').property('name', 'justin')
   ```

   버텍스에는 GUID가 포함된 `string` ID가 지정됩니다. Neptune에서 모든 버텍스 ID는 문자열입니다.

1. **사용자 지정 id가 포함된 버텍스를 추가합니다.**

   ```
   g.addV('person').property(id, '1').property('name', 'martin')
   ```

   `id` 속성은 따옴표로 묶여 있지 않습니다. 이 속성은 버텍스의 ID에 대한 키워드입니다. 여기에서 버텍스 ID는 숫자 `1`이 포함된 문자열입니다.

   일반적인 속성 이름은 따옴표로 묶여 있어야 합니다.

1. **속성이 없는 경우 속성 변경 또는 속성을 추가합니다.**

   ```
   g.V('1').property(single, 'name', 'marko')
   ```

   여기에서는 이전 단계의 버텍스에 대한 `name` 속성을 변경합니다. 이로써 `name` 속성에서 기존 값이 모두 제거됩니다.

   `single`을 지정하지 않았다면 그 대신에 `name` 속성에 값을 추가합니다(아직 추가하지 않은 경우).

1. **속성에 이미 값이 있는 경우 속성을 추가합니다. ** 

   ```
   g.V('1').property('age', 29)
   ```

   Neptune에서는 세트 카디널리티를 기본 작업으로 사용합니다.

   이 명령어를 실행하면 `29`라는 값이 포함된 `age` 속성이 추가되지만, 기존 값이 대치되는 것은 아닙니다.

   `age` 속성에 이미 값이 있는 경우 이 명령은 속성에 `29`를 추가합니다. 예를 들어 `age` 속성이 `27`이라면 새 값은 `[ 27, 29 ]`이 됩니다.

1. **다음과 같이 여러 버텍스를 추가합니다.**

   ```
   g.addV('person').property(id, '2').property('name', 'vadas').property('age', 27).iterate()
   g.addV('software').property(id, '3').property('name', 'lop').property('lang', 'java').iterate()
   g.addV('person').property(id, '4').property('name', 'josh').property('age', 32).iterate()
   g.addV('software').property(id, '5').property('name', 'ripple').property('lang', 'java').iterate()
   g.addV('person').property(id, '6').property('name', 'peter').property('age', 35)
   ```

   Neptune에 여러 문을 동시에 전송할 수 있습니다.

   문은 줄 바꿈(`'\n'`), 공백(`' '`) 또는 세미콜론(`'; '`)으로 구분할 수 있습니다. 또는 아무것도 사용하지 않아도 구분할 수 있습니다(예: `g.addV(‘person’).iterate()g.V()`는 유효함).
**참고**  
Gremlin 콘솔은 모든 줄 바꿈(`'\n'`)마다 명령을 따로 전송하므로 이 경우 각 명령은 별도의 트랜잭션이 됩니다. 읽기 쉽도록 이 예제에서는 모든 명령이 별도의 줄로 나뉘어 있습니다. Gremlin 콘솔을 통해 단일 명령으로 전송하려면 줄 바꿈(`'\n'`) 문자를 제거합니다.

   마지막 문 이외의 모든 문은 `.next()` 또는 `.iterate()`와 같은 종료 단계로 끝나야 합니다. 그러지 않으면 실행되지 않습니다. Gremlin 콘솔에는 이러한 종료 단계가 필요하지 않습니다. 결과를 직렬화할 필요가 없을 때마다 `.iterate`를 사용하세요.

   함께 전송되는 모든 문은 단일 트랜잭션에 포함되어 있어 함께 성공하거나 실패합니다.

1. **엣지 추가.**

   ```
   g.V('1').addE('knows').to(__.V('2')).property('weight', 0.5).iterate()
   g.addE('knows').from(__.V('1')).to(__.V('4')).property('weight', 1.0)
   ```

   엣지를 추가하는 방법으로 다음 두 가지가 있습니다.

1. **나머지 최신 그래프를 추가합니다.**

   ```
   g.V('1').addE('created').to(__.V('3')).property('weight', 0.4).iterate()
   g.V('4').addE('created').to(__.V('5')).property('weight', 1.0).iterate()
   g.V('4').addE('knows').to(__.V('3')).property('weight', 0.4).iterate()
   g.V('6').addE('created').to(__.V('3')).property('weight', 0.2)
   ```

1. **버텍스를 삭제합니다.**

   ```
   g.V().has('name', 'justin').drop()
   ```

   `name` 속성이 `justin`인 버텍스를 제거합니다.
**중요**  
*여기서 중지합니다. 이제 Apache TinkerPop 최신 그래프가 모두 준비되었습니다. TinkerPop 설명서의 [순회 섹션](https://tinkerpop.apache.org/docs/current/reference/#graph-traversal-steps)에 있는 예제에서는 최신 그래프를 사용합니다.*

1. **순회를 실행합니다.**

   ```
   g.V().hasLabel('person')
   ```

   모든 `person` 버텍스를 반환합니다.

1. **값(valueMap())으로 순회를 실행합니다.**

   ```
   g.V().has('name', 'marko').out('knows').valueMap()
   ```

   `marko`가 "인식하는" 모든 버텍스의 키-값 페어를 반환합니다.

1. **여러 레이블을 지정합니다.**

   ```
   g.addV("Label1::Label2::Label3") 
   ```

   Neptune은 버텍스 하나에 여러 레이블을 지원합니다. 레이블을 생성할 때 `::`로 구분하여 여러 레이블을 지정할 수 있습니다.

   이 예제에서는 세 가지 레이블이 있는 버텍스를 추가합니다.

   `hasLabel` 단계는 세 가지 레이블인 `hasLabel("Label1")`, `hasLabel("Label2")`, `hasLabel("Label3")` 중 하나와 이 버텍스를 일치시킵니다.

   `::` 구분 문자는 이 용도로만 사용됩니다.

   `hasLabel` 단계에서 여러 레이블을 지정할 수 없습니다. 예를 들어, `hasLabel("Label1::Label2")`은 어떤 것도 일치시키지 않습니다.

1. **시간/날짜를 지정합니다**.

   ```
   g.V().property(single, 'lastUpdate', datetime('2018-01-01T00:00:00'))
   ```

   Neptune은 Java 날짜를 지원하지 않습니다. 대신 `datetime()` 함수를 사용합니다. `datetime()`의 경우 ISO8061 규격 `datetime` 문자열을 수락합니다.

   `YYYY-MM-DD, YYYY-MM-DDTHH:mm`, `YYYY-MM-DDTHH:mm:SS` 및 `YYYY-MM-DDTHH:mm:SSZ` 형식을 지원합니다.

1. **버텍스, 속성 또는 엣지를 삭제합니다.**

   ```
   g.V().hasLabel('person').properties('age').drop().iterate()
   g.V('1').drop().iterate()
   g.V().outE().hasLabel('created').drop()
   ```

   다음은 drop 관련 몇 가지 예제입니다.
**참고**  
 `.next()` 단계는 `.drop()`과 연동되지 않습니다. 대신 `.iterate()`을 사용하세요.

1. 완료했으면 다음을 입력하여 Gremlin 콘솔을 종료합니다.

   ```
   :exit
   ```

**참고**  
세미콜론(`;`) 또는 줄 바꿈 문자(`\n`)를 사용하여 각 문장을 구분합니다.  
최종 순회 이전의 각 순회는 실행할 `iterate()`로 끝나야 합니다. 최종 순회의 데이터만 반환됩니다.

# openCypher를 사용하여 Amazon Neptune에서 그래프에 액세스
<a name="get-started-graph-opencypher"></a>

openCypher 사용을 시작하려면 [openCypher](access-graph-opencypher.md)를 참조하거나 GitHub [Neptune 그래프 노트북 리포지토리](https://github.com/aws/graph-notebook/tree/main/src/graph_notebook/notebooks)의 openCypher 노트북을 사용하세요.

# SPARQL을 사용하여 Amazon Neptune에서 그래프 데이터에 액세스
<a name="get-started-graph-sparql"></a>

SPARQL은 웹용으로 설계된 그래프 데이터 형식인 리소스 기술 프레임워크(RDF)의 쿼리 언어입니다. Amazon Neptune은 SPARQL 1.1과 호환됩니다. 따라서 Neptune DB 인스턴스에 연결하고 [SPARQL 1.1 쿼리 언어](https://www.w3.org/TR/sparql11-query/) 사양에서 설명하는 쿼리 언어를 사용하여 그래프를 쿼리할 수 있습니다.

 SPARQL의 쿼리는 반환하는 변수를 지정하는 `SELECT` 절과 그래프에서 일치시킬 데이터를 지정하는 `WHERE` 절로 구성됩니다. SPARQL 쿼리에 익숙하지 않은 경우 [SPARQL 1.1 쿼리 언어](https://www.w3.org/TR/sparql11-query/)의 단순 쿼리 작성을 참조하세요.

Neptune DB 인스턴스의 SPARQL 쿼리용 HTTP 엔드포인트는 `https://your-neptune-endpoint:port/sparql`입니다.

**SPARQL에 연결하려면**

1.  CloudFormation 스택의 **출력** 섹션에 있는 **SparqlEndpoint** 항목에서 Neptune 클러스터의 SPARQL 엔드포인트를 가져올 수 있습니다.

1. HTTP `POST`와 **curl** 명령어를 사용하여 SPARQL **`UPDATE`**를 제출하려면 다음을 입력합니다.

   ```
   curl -X POST --data-binary 'update=INSERT DATA { <https://test.com/s> <https://test.com/p> <https://test.com/o> . }' https://your-neptune-endpoint:port/sparql
   ```

   앞 예제에서는 다음 트리플을 SPARQL 기본 그래프에 삽입했습니다(`<https://test.com/s> <https://test.com/p> <https://test.com/o>`).

1. HTTP `POST`와 **curl** 명령어를 사용하여 SPARQL **`QUERY`**를 제출하려면 다음을 입력합니다.

   ```
   curl -X POST --data-binary 'query=select ?s ?p ?o where {?s ?p ?o} limit 10' https://your-neptune-endpoint:port/sparql
   ```

   앞의 예제에서는 10개 제한이 있는 `?s ?p ?o` 쿼리를 사용하여 그래프에서 최대 10개의 트리플(subject-predicate-object)을 반환했습니다. 다른 것을 쿼리하려면 다른 SPARQL 쿼리로 바꿉니다.
**참고**  
응답의 기본 MIME 유형이 `SELECT` 및 `ASK` 쿼리는 `application/sparql-results+json`입니다.  
응답의 기본 MIME 유형이 `CONSTRUCT` 및 `DESCRIBE` 쿼리는 `application/n-quads`입니다.  
사용 가능한 모든 MIME 유형 목록은 [SPARQL HTTP API](sparql-api-reference.md) 단원을 참조하십시오.