View a markdown version of this page

Amazon Neptune の Gremlin 標準への準拠 - Amazon Neptune

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

Amazon Neptune の Gremlin 標準への準拠

以下のセクションでは、Gremlin の Neptune 実装の概要と、Apache TinkerPop の実装との違いについて説明します。

Neptune はそのエンジンでいくつかの Gremlin ステップをネイティブに実装し、Apache TinkerPop Gremlin 実装を使用して他のステップを処理します (Amazon Neptune でのネイティブ Gremlin ステップサポート)。

注記

Gremlin コンソールと Amazon Neptune における実装の違いの具体的な例については、クイックスタートの Gremlin を使用して Amazon Neptune のグラフデータにアクセスする セクションを参照してください。

Gremlin に適用される標準

スクリプト内の変数とパラメータ

事前にバインドされた変数に関しては、トラバーサルオブジェクト g はNeptune では事前にバインドされており、graph オブジェクトはサポートされていません。

Neptune は Gremlin 変数やスクリプト内のパラメータ化をサポートしていませんが、インターネット上では、次のような変数宣言を含む Gremlin Server 用のサンプルスクリプトをよく目にすることがあります。

String query = "x = 1; g.V(x)"; List<Result> results = client.submit(query).all().get();

また、クエリの送信時にパラメータ化 (またはバインディング) を利用する例も多数あります。例えば、次のようになります。

Map<String,Object> params = new HashMap<>(); params.put("x",1); String query = "g.V(x)"; List<Result> results = client.submit(query).all().get();

パラメータの例は通常、可能であればパラメータ化しないことによるパフォーマンス上のペナルティに関する警告と関連付けられます。TinkerPop にはこのような例がたくさんあり、パラメータ化の必要性についてはどれも納得のいくものです。

ただし、変数宣言機能とパラメータ化機能 (および警告) はどちらも、TinkerPop の Gremlin Server が GremlinGroovyScriptEngine を使用している場合にのみ適用されます。Gremlin Server が Gremlin の gremlin-language ANTLR 文法を使用してクエリを解析する場合には適用されません。ANTLR 文法は変数宣言もパラメータ化もサポートしていないため、ANTLR を使用するときにはパラメータ化の失敗を心配する必要はありません。ANTLR 文法は TinkerPop の新しいコンポーネントであるため、インターネット上で遭遇する可能性のある古いコンテンツには、一般的にこの区別が反映されていません。

Neptune は、クエリ処理エンジンでは GremlinGroovyScriptEngine ではなく ANTLR 文法を使用するため、変数、パラメータ化、または bindings プロパティをサポートしません。その結果、パラメータ化の失敗に関連する問題は、Neptune には当てはまりません。Neptune を使用すると、通常はパラメータ化するようなクエリをそのまま送信しても完全に安全です。そのため、前の例を次のように簡略化しても、パフォーマンスを低下させずに済みます。

String query = "g.V(1)"; List<Result> results = client.submit(query).all().get();

スクリプトの実行

Neptune の Gremlin エンジンは、TinkerPop の gremlin-language ANTLR 文法を使用してクエリを解析します。(一部の TinkerPop ベースの Gremlin サーバーのデプロイGremlinGroovyScriptEngineのように) は実行されないため、Neptune に送信されるスクリプトには Gremlin 言語のみを含める必要があり、任意の Groovy または Java コードを含めることはできません。

スクリプトは、Gremlin REST エンドポイントGremlin コンソール、TinkerPop 言語ドライバー (Java ドライバーのスクリプトクライアントなど) など、さまざまな方法で Neptune に送信できます。このセクションで説明する制約は、これらのテキスト文字列送信パスのいずれかに適用されます。

Gremlin 言語自体を、他の場所で Gremlin の例をラッピングしているプログラミング言語の構文的なシュガーまたは汎用関数と混同しないことが重要です。このようなコードが TinkerPop チュートリアルまたはオンラインサンプルに表示される場合、Neptune が提供していない Groovy または Java ランタイムによって異なります。

重要

このセクションのすべての内容は、テキスト文字列 Gremlin 送信に適用されます。Java、Python、.NET などのホスト言語で構築された GLV (Gremlin Language Variant) バイトコードの送信は、ホスト言語トラバーサルビルダーが Neptune のエンジンが直接消費するバイトコードを生成するため、これらの制約の対象ではありません。

スクリプトに含まれる可能性のある内容

  • すべてのクエリは、トラバーサルオブジェクト g で始まる必要があります。

  • 複数のトラバーサルは、セミコロン (;) または改行文字 () で区切られた 1 つの送信で発行できます\n。最後の 以外のすべてのステートメントは、実行する.iterate()ステップで終わる必要があります。最後のトラバーサルのデータのみが返されます。

TinkerPop 列挙値の参照

TinkerPop 列挙値がステップ引数として予想される場合 ( の基数property()や の順序などby())、ANTLR 文法で認識される短い形式の値を使用します。Neptune はこの位置で完全修飾 Java クラス名を解決しません。たとえば、 org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.singleは受け入れられません。single代わりに を使用してください。

次の表は、許可されるショートフォーム値と、それぞれが属する基盤となる TinkerPop クラスの一覧です。

スクリプトに含まれていない可能性があるもの

以下は、Neptune へのテキスト文字列 Gremlin クエリではサポートされていません。これらは、Neptune が提供していない Groovy または Java ランタイムサポートに依存しているためです。

  • で始まらない Groovy ステートメントgこれには、以下が含まれます。

    • などの算術式 1 + 1

    • などのシステム呼び出し System.nanoTime()

    • などの変数宣言 x = 1; g.V(x)

  • サポートされている Gremlin APIs 以外の Java メソッドまたはライブラリ呼び出し。たとえば、java.lang.*Date()、および g.V().tryNext().orElseGet(...) は許可されていません。

  • Java タイプを引数として使用する Gremlin メソッド。これらは、テキスト文字列送信からではなく、JVM 言語ホストからのみアクセスできます。例:

    • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.program(org.apache.tinkerpop.gremlin.process.computer.VertexProgram)

    • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.sideEffect(java.util.function.Consumer)

    • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.from(org.apache.tinkerpop.gremlin.structure.Vertex)

    • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.to(org.apache.tinkerpop.gremlin.structure.Vertex)

    たとえば、次のトラバーサルはテキスト文字列として送信できません: g.V().addE('something').from(__.V().next()).to(__.V().next())

要素のプロパティ

Neptune は、要素のプロパティを返すために TinkerPop 3.7.0 で導入された materializeProperties フラグをサポートしていません。その結果、Neptune は頂点またはエッジのみを id および label のみの参照として返します。

セッション

Neptune のセッションは、長さが 10 分のみに制限されます。詳細については、「Gremlin スクリプトベースのセッション」およびTinkerPop セッションリファレンスを参照してください。

取引

Neptune は、各 Gremlin トラバーサルの開始時に新しいトランザクションを開き、トラバーサルが正常に完了したときにトランザクションを閉じます。エラーが発生すると、トランザクションはロールバックされます。

セミコロン (;) または改行文字 (\n) で区切られた複数のステートメントは、単一のトランザクションに含まれています。最後のもの以外の各ステートメントは、next() ステップの実行で終わる必要があります。最終的なトラバーサルデータのみが返されます。

tx.commit() および tx.rollback() を使用した手動トランザクションロジックはサポートされていません。

重要

これは Gremlin クエリをテキスト文字列として送信するメソッドのみに当てはまります (「Gremlin トランザクション」を参照)。

頂点およびエッジ ID

Neptune Gremlin 頂点およびエッジ ID は、タイプ String である必要があります。これらの ID 文字列は Unicode 文字をサポートし、サイズは 55 MB を超えることはできません。

ユーザーが指定した ID はサポートされますが、通常の使用ではオプションとなります。頂点やエッジを追加するときに ID を指定しなかった場合、Neptune は UUID を生成し、次のような形式の文字列に変換します。これらの UUID は RFC 標準に準拠していないため、標準 UUID が必要な場合は、外部で生成し、頂点やエッジを追加するときに指定する必要があります。

注記

Neptune Load コマンドでは、~id フィールドを使用して、Neptune CSV 形式で ID を指定する必要があります。

ユーザーによって指定された ID

ユーザーにより提供される ID は、以下の規定により Neptune Gremlin で許可されます。

  • 指定 ID はオプションです。

  • 頂点とエッジのみがサポートされています。

  • タイプ String のみがサポートされます。

カスタム ID で新しい頂点を作成するには、id キーワードで property ステップを使用します。g.addV().property(id, 'customid')

注記

id キーワードを引用符で囲むことはできません。T.id を指します。

すべての頂点 ID およびすべてのエッジ ID は、一意である必要があります。ただし、Neptune では、頂点とエッジで同じ ID を持つことができます。

g.addV() を使用して新しい頂点を作成しようとする場合、既にその ID を持つ頂点が存在すると、オペレーションは失敗します。この例外として、頂点に新しいラベルを指定するとオペレーションは成功しますが、新しいラベルおよび既存の頂点に指定されたすべての追加のプロパティが追加されます。Nothing は上書きされます。新しい頂点は作成されません。頂点 ID は変更せず、一意のままになります。

たとえば、次の Gremlin コンソールコマンドは成功します。

gremlin> g.addV('label1').property(id, 'customid') gremlin> g.addV('label2').property(id, 'customid') gremlin> g.V('customid').label() ==>label1::label2

頂点プロパティ ID

頂点プロパティ ID は自動的に生成され、クエリを実行したときに、正または負の数値で表示されます。

頂点プロパティのカーディナリティ

Neptune は、セット濃度と単一濃度をサポートしています。指定されていない場合は、セット濃度が選択されます。つまり、プロパティ値を設定した場合、値のセットに既に表示されていない場合にのみ、プロパティに新しい値が追加されます。これは、セットの Gremlin 列挙の値です。

List はサポートされていません。プロパティ濃度の詳細については、Gremlin JavaDoc にある「頂点」 トピックを参照してください。

頂点プロパティの更新

値のセットに追加の値を追加せずにプロパティ値を更新するには、property ステップで single 濃度を指定します。

g.V('exampleid01').property(single, 'age', 25)

これにより、既存のプロパティの値はすべて削除されます。

ラベル

Neptune は、頂点の複数のラベルをサポートしています。ラベルを作成する際、:: で区切ることで複数のラベルを指定できます。たとえば、g.addV("Label1::Label2::Label3") は頂点に 3 つの異なるラベルを追加します。hasLabel ステップでは、この頂点を hasLabel("Label1")hasLabel("Label2")、および hasLabel("Label3") の 3 つのラベルのいずれかと一致させます。

重要

:: 区切り記号は、この使用のみに予約されます。hasLabel ステップで複数のラベルを指定することはできません。たとえば、hasLabel("Label1::Label2") はいずれにも一致しません。

エスケープ文字

Neptune は、Apache Groovy 言語ドキュメントの 特殊文字のエスケープ セクションで説明されているすべてのエスケープ文字を解決します。

シリアル化

Neptune は、リクエストされた MIME タイプに基づいて、以下のシリアル化をサポートしています。

Neptune では、TinkerPop が提供する多くのシリアライザーを使用できます。GraphSON と GraphBinary のさまざまなバージョンと設定がサポートされています。現在サポートされているシリアライザーについては、次の表を参照してください。多くのオプションがありますが、使用するガイダンスは簡易です。

  • Apache TinkerPop ドライバーを使用している場合は、ドライバーを明示的に指定せずに、ドライバーのデフォルトを優先します。特に理由がない限り、ドライバーの初期化でシリアライザーを指定する必要はありません。一般的に、ドライバーで使用されるデフォルトは application/vnd.graphbinary-v1.0 です。

  • HTTP 経由で Neptune に接続する場合は、GraphSON 3 の代替バージョンで埋め込みタイプとして application/vnd.gremlin-v3.0+json;types=false を使用することを優先し、操作を複雑にします。

  • 一般的に、application/vnd.graphbinary-v1.0-stringd はすべての結果を文字列表現に変換して簡単に表示するため、Gremlin コンソールと組み合わせて使用する場合にのみ活用できます。

  • 残りの形式はレガシーの理由で残っており、通常、明確な原因がないドライバーでは使用しないでください。

MIME type Serialization Configuration

application/vnd.gremlin-v1.0+json;types=false

GraphSONUntypedMessageSerializerV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerV2 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v2.0+json;types=false

GraphSONUntypedMessageSerializerV2 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/vnd.gremlin-v3.0+json;types=false

GraphSONUntypedMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/json

GraphSONUntypedMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1

application/vnd.graphbinary-v1.0-stringd

GraphBinaryMessageSerializerV1 serializeResultToString: true

application/vnd.gremlin-v1.0+json

GraphSONMessageSerializerGremlinV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerV2   (only works with WebSockets) ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3

application/json

GraphSONMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1
注記

ここに示すシリアライザーテーブルは、TinkerPop 3.7.0 時点の命名を参照しています。この変更の詳細については、TinkerPop アップグレードドキュメントを参照してください。Gryo シリアル化のサポートは 3.4.3 で廃止され、3.6.0 で正式に削除されました。Gryo または Gryo をデフォルトで使用しているドライバーバージョンで明示的に使用している場合は、GraphBinary に切り替えるか、ドライバーをアップグレードする必要があります。

Lambda ステップ

Neptune では、Lambda ステップはサポートされていません。

サポートされていない Gremlin ステップ

Neptune は、以下の Gremlin ステップをサポートしていません。

  • Gremlin io( ) ステップは、Neptune では部分的にしかサポートされていません。のように読み取りコンテキストで使用できますがg.io("https://example.com/data/my-graph.graphml").read()、書き込みには使用できません。Amazon S3 オブジェクトとして保存するファイルを読み取るには、まず署名付き URL を生成します。次に、その HTTPS URL を に渡しますg.io()。署名付き URLsAmazon S3ユーザーガイド」の「署名付き URLs」を参照してください。

Neptune での Gremlin グラフ機能

Gremlin の Neptune 実装には、graph オブジェクトは表示されません。次の表は、Gremlin の機能と、Neptune がそれらをサポートしているかどうかを示しています。

Neptune の graph 機能のサポート

Neptune グラフ機能は、サポートされている場合、graph.features() コマンドによって返されるものと同じです。

グラフ機能 有効?
取引 true
ThreadedTransactions false
[コンピュータ] false
永続的 true
ConcurrentAccess true

Neptune の変数機能のサポート

変数機能 有効?
[変数] false
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues false
ByteValues false
DoubleValues false
FloatValues false
IntegerValues false
LongValues false
MapValues false
MixedListValues false
StringValues false
ByteArrayValues false
FloatArrayValues false
LongArrayValues false

Neptune の頂点機能のサポート

頂点機能 有効?
MetaProperties false
DuplicateMultiProperties false
AddVertices true
RemoveVertices true
MultiProperties true
UserSuppliedIds true
AddProperty true
RemoveProperty true
NumericIds false
StringIds true
UuidIds false
CustomIds false
AnyIds false

Neptune の頂点プロパティ機能のサポート

頂点プロパティ機能 有効?
UserSuppliedIds false
AddProperty true
RemoveProperty true
NumericIds true
StringIds true
UuidIds false
CustomIds false
AnyIds false
プロパティ true
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues true
ByteValues true
DoubleValues true
FloatValues true
IntegerValues true
LongValues true
MapValues false
MixedListValues false
StringValues true
ByteArrayValues false
FloatArrayValues false
LongArrayValues false

Neptune のエッジ機能のサポート

エッジ機能 有効?
AddEdges true
RemoveEdges true
UserSuppliedIds true
AddProperty true
RemoveProperty true
NumericIds false
StringIds true
UuidIds false
CustomIds false
AnyIds false

Neptune のエッジプロパティ機能のサポート

エッジプロパティ機能 有効?
プロパティ true
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues true
ByteValues true
DoubleValues true
FloatValues true
IntegerValues true
LongValues true
MapValues false
MixedListValues false
StringValues true
ByteArrayValues false
FloatArrayValues false
LongArrayValues false