

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

# 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()`로 끝나야 합니다. 최종 순회의 데이터만 반환됩니다.