기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Gremlin을 사용하여 Amazon Neptune의 그래프 데이터 액세스
Gremlin 콘솔을 사용하여 REPL(read-eval-print loop) 환경에서 TinkerPop 그래프 및 쿼리를 실험할 수 있습니다.
다음 자습서에서는 Gremlin 콘솔을 사용하여 Neptune 그래프에 버텍스, 엣지, 속성 등을 추가하는 방법을 안내하고 Neptune별 Gremlin 구현의 몇 가지 차이점을 강조합니다.
참고
이 예제에서는 다음을 완료했다고 가정합니다.
SSH를 사용하여 Amazon EC2 인스턴스에 연결했습니다.
Neptune 클러스터 생성에 나와 있는 대로 Neptune 클러스터를 생성했습니다.
Gremlin 콘솔 설치의 설명대로 Gremlin 콘솔을 설치했습니다.
Gremlin 콘솔 사용
-
디렉터리를 Gremlin 콘솔 파일의 압축을 푼 폴더로 변경합니다.
cd apache-tinkerpop-gremlin-console-3.7.2
-
다음 명령을 입력하여 Gremlin 콘솔을 실행합니다.
bin/gremlin.sh
다음 결과가 표시됩니다.
\,,,/ (o o) -----oOOo-(3)-oOOo----- plugin activated: tinkerpop.server plugin activated: tinkerpop.utilities plugin activated: tinkerpop.tinkergraph gremlin>
이제
gremlin>
프롬프트가 표시됩니다. 이 프롬프트에 나머지 단계를 입력합니다. -
gremlin>
프롬프트에 다음을 입력하여 Neptune DB 인스턴스에 연결합니다.:remote connect tinkerpop.server conf/neptune-remote.yaml
-
gremlin>
프롬프트에 다음을 입력하여 원격 모드로 전환합니다. 그러면 모든 Gremlin 쿼리가 원격 연결로 전송됩니다.:remote console
-
레이블 및 속성이 포함된 버텍스를 추가합니다.
g.addV('person').property('name', 'justin')
버텍스에는 GUID가 포함된
string
ID가 지정됩니다. Neptune에서 모든 버텍스 ID는 문자열입니다. -
사용자 지정 id가 포함된 버텍스를 추가합니다.
g.addV('person').property(id, '1').property('name', 'martin')
id
속성은 따옴표로 묶여 있지 않습니다. 이 속성은 버텍스의 ID에 대한 키워드입니다. 여기에서 버텍스 ID는 숫자1
이 포함된 문자열입니다.일반적인 속성 이름은 따옴표로 묶여 있어야 합니다.
-
속성이 없는 경우 속성 변경 또는 속성을 추가합니다.
g.V('1').property(single, 'name', 'marko')
여기에서는 이전 단계의 버텍스에 대한
name
속성을 변경합니다. 이로써name
속성에서 기존 값이 모두 제거됩니다.single
을 지정하지 않았다면 그 대신에name
속성에 값을 추가합니다(아직 추가하지 않은 경우). -
속성에 이미 값이 있는 경우 속성을 추가합니다.
g.V('1').property('age', 29)
Neptune에서는 세트 카디널리티를 기본 작업으로 사용합니다.
이 명령어를 실행하면
29
라는 값이 포함된age
속성이 추가되지만, 기존 값이 대치되는 것은 아닙니다.age
속성에 이미 값이 있는 경우 이 명령은 속성에29
를 추가합니다. 예를 들어age
속성이27
이라면 새 값은[ 27, 29 ]
이 됩니다. -
다음과 같이 여러 버텍스를 추가합니다.
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
를 사용하세요.함께 전송되는 모든 문은 단일 트랜잭션에 포함되어 있어 함께 성공하거나 실패합니다.
-
엣지 추가.
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)
엣지를 추가하는 방법으로 다음 두 가지가 있습니다.
-
나머지 최신 그래프를 추가합니다.
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)
-
버텍스를 삭제합니다.
g.V().has('name', 'justin').drop()
name
속성이justin
인 버텍스를 제거합니다.중요
여기서 중지합니다. 이제 Apache TinkerPop 최신 그래프가 모두 준비되었습니다. TinkerPop 설명서의 순회 섹션
에 있는 예제에서는 최신 그래프를 사용합니다. -
순회를 실행합니다.
g.V().hasLabel('person')
모든
person
버텍스를 반환합니다. -
값(valueMap())으로 순회를 실행합니다.
g.V().has('name', 'marko').out('knows').valueMap()
marko
가 "인식하는" 모든 버텍스의 키-값 페어를 반환합니다. -
여러 레이블을 지정합니다.
g.addV("Label1::Label2::Label3")
Neptune은 버텍스 하나에 여러 레이블을 지원합니다. 레이블을 생성할 때
::
로 구분하여 여러 레이블을 지정할 수 있습니다.이 예제에서는 세 가지 레이블이 있는 버텍스를 추가합니다.
hasLabel
단계는 세 가지 레이블인hasLabel("Label1")
,hasLabel("Label2")
,hasLabel("Label3")
중 하나와 이 버텍스를 일치시킵니다.::
구분 문자는 이 용도로만 사용됩니다.hasLabel
단계에서 여러 레이블을 지정할 수 없습니다. 예를 들어,hasLabel("Label1::Label2")
은 어떤 것도 일치시키지 않습니다. -
시간/날짜를 지정합니다.
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
형식을 지원합니다. -
버텍스, 속성 또는 엣지를 삭제합니다.
g.V().hasLabel('person').properties('age').drop().iterate() g.V('1').drop().iterate() g.V().outE().hasLabel('created').drop()
다음은 drop 관련 몇 가지 예제입니다.
참고
.next()
단계는.drop()
과 연동되지 않습니다. 대신.iterate()
을 사용하세요. -
완료했으면 다음을 입력하여 Gremlin 콘솔을 종료합니다.
:exit
참고
세미콜론(;
) 또는 줄 바꿈 문자(\n
)를 사용하여 각 문장을 구분합니다.
최종 순회 이전의 각 순회는 실행할 iterate()
로 끝나야 합니다. 최종 순회의 데이터만 반환됩니다.