翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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はデフォルトのアクションとしてカーディナリティ (cardinality) を使用します。
このコマンドは
age
プロパティを追加して値29
を指定しますが、既存の値は置き換えません。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 コンソールから 1 つのコマンドとして送信するには、改行 ('\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)
ここでは、2 つの異なる方法でエッジを追加しています。
-
Modern グラフの残りの部分を追加します。
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 Modern グラフが得られます。TinkerPop ドキュメントのTraversal セクション
の例では、Modern グラフが使用されています。 -
トラバーサルを実行します。
g.V().hasLabel('person')
すべての
person
頂点を返します。 -
値付きのトラバーサルを実行します (valueMap())。
g.V().has('name', 'marko').out('knows').valueMap()
marko
"knows" に該当するすべての頂点のキーと値のペアを返します。 -
複数のラベルを指定します。
g.addV("Label1::Label2::Label3")
Neptune は、頂点の複数のラベルをサポートしています。ラベルを作成する際、
::
で区切ることで複数のラベルを指定できます。この例では、1 つの頂点に 3 つの異なるラベルを追加します。
hasLabel
ステップでは、この頂点をhasLabel("Label1")
、hasLabel("Label2")
、およびhasLabel("Label3")
の 3 つのラベルのいずれかと一致させます。::
区切り記号は、この使用のみに予約されます。hasLabel
ステップで複数のラベルを指定することはできません。たとえば、hasLabel("Label1::Label2")
はいずれにも一致しません。 -
日付 / 時刻を指定します。
g.V().property(single, 'lastUpdate', datetime('2018-01-01T00:00:00'))
Neptune は Java Date をサポートしていません。代わりに、
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()
ここでは、いくつかの削除例を示しています。
注記
.next()
ステップは.drop()
では機能しません。代わりに.iterate()
を使用します。 -
完了したら、次のように入力して Gremlin コンソールを終了します。
:exit
注記
各ステートメントを区切るには、セミコロン (;
) または改行文字 (\n
) を使用します。
最終的なトラバーサルに先行する各トラバーサルは、iterate()
を実行して終わる必要があります。最終的なトラバーサルからのデータのみが返されます。