Gremlin を使用して Amazon Neptune のグラフデータにアクセスする - Amazon Neptune

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Gremlin を使用して Amazon Neptune のグラフデータにアクセスする

Gremlin コンソールを使用して、REPL (read-eval-print loop) 環境で TinkerPop グラフおよびクエリを試してみることができます。

以下のチュートリアルでは、Gremlin コンソールを使用して頂点、エッジ、プロパティなどを Neptune グラフに追加する方法を取り上げ、Neptune 固有の Gremlin 実装のいくつかの違いに着目します。

注記

この例では、次の操作が完了していることを前提としています。

Gremlin コンソールの使用
  1. ディレクトリを Gremlin コンソールファイルが解凍されたフォルダに変更します。

    cd apache-tinkerpop-gremlin-console-3.7.2
  2. 以下のコマンドを入力して、Gremlin コンソールを実行します。

    bin/gremlin.sh

    以下の出力が表示されます。

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

    gremlin> プロンプトが表示されます。このプロンプトで残りのステップを入力します。

  3. gremlin> プロンプトで、次のように入力して Neptune DB インスタンスに接続します。

    :remote connect tinkerpop.server conf/neptune-remote.yaml
  4. gremlin> プロンプトで、次のように入力してリモートモードに切り替えます。これにより、すべての Gremlin クエリがリモート接続に送信されます。

    :remote console
  5. 頂点を追加して、ラベルとプロパティを割り当てます。

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

    頂点には、GUID を含む string ID が割り当てられます。Neptune ではすべての頂点 ID は文字列です。

  6. 頂点を追加して、カスタム ID を割り当てます。

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

    id プロパティは引用符で囲みません。これは、頂点 ID のキーワードです。ここでの頂点 ID は、数字 1 を含む文字列です。

    通常のプロパティ名は引用符で囲む必要があります。

  7. プロパティを変更するか、プロパティを追加します (まだ追加してない場合)。

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

    ここでは、前のステップからの頂点の name プロパティを変更します。これにより、name プロパティの既存の値はすべて削除されます。

    single を指定しなかった場合は、代わりに name プロパティに値が付加されます (まだ付加されていない場合)。

  8. プロパティを追加しますが、プロパティにすでに値がある場合は値を付加します。

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

    Neptuneはデフォルトのアクションとしてカーディナリティ (cardinality) を使用します。

    このコマンドは age プロパティを追加して値 29 を指定しますが、既存の値は置き換えません。

    age プロパティにすでに値がある場合、このコマンドはプロパティに 29 を付加します。たとえば、age プロパティの値が 27 である場合、新しい値は [ 27, 29 ] となります。

  9. 複数の頂点を追加します。

    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 つのトランザクションに含まれ、まとめて成功または失敗となります。

  10. エッジを追加します。

    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 つの異なる方法でエッジを追加しています。

  11. 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)
  12. 頂点を削除します。

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

    name プロパティが justin である頂点を削除します。

    重要

    ここで停止すると、完全な Apache TinkerPop Modern グラフが得られます。TinkerPop ドキュメントのTraversal セクションの例では、Modern グラフが使用されています。

  13. トラバーサルを実行します。

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

    すべての person 頂点を返します。

  14. 値付きのトラバーサルを実行します (valueMap())。

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

    marko "knows" に該当するすべての頂点のキーと値のペアを返します。

  15. 複数のラベルを指定します。

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

    Neptune は、頂点の複数のラベルをサポートしています。ラベルを作成する際、:: で区切ることで複数のラベルを指定できます。

    この例では、1 つの頂点に 3 つの異なるラベルを追加します。

    hasLabel ステップでは、この頂点を hasLabel("Label1")hasLabel("Label2")、および hasLabel("Label3") の 3 つのラベルのいずれかと一致させます。

    :: 区切り記号は、この使用のみに予約されます。

    hasLabel ステップで複数のラベルを指定することはできません。たとえば、hasLabel("Label1::Label2") はいずれにも一致しません。

  16. 日付 / 時刻を指定します

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

    Neptune は Java Date をサポートしていません。代わりに、 datetime() 関数を使用します。datetime() は ISO8061 準拠 datetime 文字列を受け入れます。

    サポートされている形式は、YYYY-MM-DD, YYYY-MM-DDTHH:mmYYYY-MM-DDTHH:mm:SSYYYY-MM-DDTHH:mm:SSZ です。

  17. 頂点、プロパティ、またはエッジを削除します。

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

    ここでは、いくつかの削除例を示しています。

    注記

    .next() ステップは .drop() では機能しません。代わりに .iterate() を使用します。

  18. 完了したら、次のように入力して Gremlin コンソールを終了します。

    :exit
注記

各ステートメントを区切るには、セミコロン (;) または改行文字 (\n) を使用します。

最終的なトラバーサルに先行する各トラバーサルは、iterate() を実行して終わる必要があります。最終的なトラバーサルからのデータのみが返されます。