

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

# Neptune で Gremlin を使用するための一般的なベストプラクティス
<a name="best-practices-gremlin"></a>

Neptune で Gremlin グラフトラバーサル言語を使用する際は次の推奨事項に従います。Neptune での Gremlin 利用の詳細については、[Gremlin を使用した Neptune グラフへのアクセス](access-graph-gremlin.md)を参照してください。

**重要**  
TinkerPop バージョン 3.4.11 に変更が加えられ、クエリの処理方法の正確性が向上しましたが、現時点ではクエリのパフォーマンスに重大な影響を与える場合があります。  
たとえば、この種類のクエリの実行速度が大幅に遅くなる可能性があります。  

```
g.V().hasLabel('airport').
  order().
    by(out().count(),desc).
  limit(10).
  out()
```
TinkerPop 3.4.11 の変更により、制限ステップの後の頂点は、最適ではない方法でフェッチされるようになりました。これを回避するには、barrier() ステップを `order().by()` の次の任意のポイントに追加して、クエリを変更できます。例:   

```
g.V().hasLabel('airport').
  order().
    by(out().count(),desc).
  limit(10).
  barrier().
  out()
```
TinkerPop 3.4.11 が Neptune [エンジンバージョン 1.0.5.0](engine-releases-1.0.5.0.md) で有効になりました。

**Topics**
+ [Neptune Serverless のハートビート設定](best-practices-gremlin-heartbeat-serverless.md)
+ [DFE エンジンを活用するためのアップサートクエリの構築](#best-practices-gremlin-upserts)
+ [Gremlin コードをデプロイするコンテキストでテストする](best-practices-gremlin-console-glv-differences.md)
+ [効率的なマルチスレッドの Gremlin 書き込みの作成](best-practices-gremlin-multithreaded-writes.md)
+ [作成時刻プロパティを使用したレコードの削除](best-practices-gremlin-prune.md)
+ [Groovy の時刻データに対する `datetime( )` メソッドの使用](best-practices-gremlin-datetime.md)
+ [GLV 時刻データのネイティブの日付と時刻の使用](best-practices-gremlin-datetime-glv.md)

# Neptune Serverless のハートビート設定
<a name="best-practices-gremlin-heartbeat-serverless"></a>

Neptune Serverless で Gremlin WebSocket クライアントを使用する場合は、スケーリングイベント中に安定した接続を維持するために、クライアントの ping 間隔を適切に設定する必要があります。Gremlin クライアントは WebSocket 接続を使用し、定期的な ping を送信して接続がアクティブであることを確認します。クライアントは、ping 間隔の期間内にサーバーからのレスポンスを期待します。サーバーが応答しない場合、クライアントは自動的に接続を閉じます。

Neptune で**プロビジョニングされた**インスタンスの場合、ping 間隔を **5 秒**に設定することをお勧めします。Neptune **Serverless クラスター**の場合、スケーリングオペレーション中の潜在的な遅延に対応するために、ping 間隔を少なくとも **20 秒**に設定することをお勧めします。このパラメータは、クライアントがサーバーへの書き込みから ping を送信して接続がまだアクティブであることを確認するまでの待機時間を制御します。

このパラメータの設定は、クライアントの実装によって異なります。

**Java クライアント設定**

Java TinkerPop Gremlin クライアントの場合は、 `keepAliveInterval`パラメータを設定します。

```
Cluster.Builder builder = Cluster.build()
    .addContactPoint(endpoint)
    .keepAliveInterval(20000); // Configure ping interval in milliseconds
```

Java ドライバー設定の詳細については、[Java TinkerPop ドキュメント](https://tinkerpop.apache.org/docs/current/reference/#gremlin-java-configuration)を参照してください。

**Go クライアント設定**

Gremlin Go クライアントの場合は、 `KeepAliveInterval`パラメータを設定します。

```
rc, err := driver.NewDriverRemoteConnection(endpoint,
    func(settings *driver.DriverRemoteConnectionSettings) {
        settings.TraversalSource = "g"
        settings.AuthInfo = auth
        settings.KeepAliveInterval = 20 * time.Second // Configure ping interval
        ...
    })
```

Go ドライバー設定の詳細については、Go [ TinkerPop ドキュメント](https://tinkerpop.apache.org/docs/current/reference/#gremlin-go-configuration)を参照してください。

**JavaScript/Node.js クライアント設定**

JavaScript/Node.js Gremlin クライアントの場合は、 `pingInterval`パラメータを設定します。

```
const gremlin = require('gremlin');
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;

const connection = new DriverRemoteConnection(endpoint, {
    traversalSource: 'g',
    pingInterval: 20000  // Configure ping interval in milliseconds
});
```

JavaScript ドライバー設定の詳細については、[JavaScript TinkerPop ドキュメント](https://tinkerpop.apache.org/docs/current/reference/#gremlin-javascript-configuration)を参照してください。

**Python クライアント設定**

Python Gremlin クライアントの場合、ping 間隔は通常トランスポートレイヤーで管理されます。設定オプションについては、特定のトランスポート実装ドキュメントを参照してください。

```
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection

g = traversal().with_remote(
    DriverRemoteConnection('wss://your-neptune-endpoint:your-neptune-port/gremlin','g',
        transport_factory=lambda: AiohttpTransport(read_timeout=60,
                                                    write_timeout=20,
                                                    heartbeat=20, // Configure heartbeat
                                                    call_from_event_loop=True,
                                                    max_content_length=100*1024*1024,
                                                    ssl_options=ssl.create_default_context(Purpose.CLIENT_AUTH))))
```

Python ドライバー設定の詳細については、[Python TinkerPop ドキュメント](https://tinkerpop.apache.org/docs/current/reference/#gremlin-python-configuration)を参照してください。

この設定により、クライアントは Neptune Serverless スケーリングイベント中に接続の安定性を維持し、不要な接続の閉鎖を防ぎ、アプリケーションの信頼性が向上します。

## DFE エンジンを活用するためのアップサートクエリの構築
<a name="best-practices-gremlin-upserts"></a>

[Gremlin `mergeV()` および `mergeE()` ステップによる効率的なアップサートの実行](gremlin-efficient-upserts.md) DFE エンジンをできるだけ効果的に使用するようにアップサートクエリを構成する方法について説明します。

# Gremlin コードをデプロイするコンテキストでテストする
<a name="best-practices-gremlin-console-glv-differences"></a>

Gremlin では、クライアントがサーバーにクエリを送信する方法が複数あります。WebSocket または Bytecode GLV を使用するか、文字列ベースのスクリプトを使用して Gremlin コンソールを使用します。

Gremlin クエリの実行は、クエリの送信方法によって異なる可能性があることを認識することが重要です。空の結果を返すクエリは、バイトコードモードで送信された場合は成功したものとして扱われますが、スクリプトモードで送信された場合は失敗として扱われます。例えば、スクリプトモードのクエリに `next()` を含むと、`next()` はサーバに送信されますが、ByteCode を使用してクライアントは通常、`next()` 自体を処理します。最初のケースでは、結果が見つからなければクエリは失敗しますが、2 番目のケースでは、結果セットが空であるかどうかにかかわらず、クエリは成功します。

コードを 1 つのコンテキスト (たとえば、一般的にテキスト形式でクエリを送信する Gremlin コンソール) で開発およびテストし、別のコンテキスト (たとえば、Bytecode を使用して Java ドライバを介して) にコードをデプロイすると、コードの動作が開発環境では発生しなかった問題が本番環境で生じる可能性があります。

**重要**  
予期せぬ結果を避けるために、デプロイされる GLV コンテキストで Gremlin コードをテストしてください。

# 効率的なマルチスレッドの Gremlin 書き込みの作成
<a name="best-practices-gremlin-multithreaded-writes"></a>

Gremlin を使用して Neptune にデータをマルチスレッドでロードするためのガイドラインがいくつかあります。

可能な場合は、各スレッドに衝突しないように挿入または変更するための頂点またはエッジのセットを渡します。たとえば、スレッド 1 は 1 〜 50,000 の ID 範囲を、スレッド 2 は 50,001 〜 100,000 の ID 範囲を、というように続きます。これにより、`ConcurrentModificationException` が発生する可能性が低くなります。安全を期すために、すべての書き込みに `try/catch` ブロックを付けてください。失敗した場合は、しばらくしてから再試行できます。

一般に、50〜100 (頂点またはエッジ) の間のバッチサイズでの書き込みはうまく機能します。各頂点に追加されるプロパティがたくさんある場合は、100 よりも 50 に近い数が適しています。一部の実験は役立ちます。したがって、バッチオペレーションされた書き込みは次のようなものを使用できます。

```
g.addV(‘test’).property(id,’1’).as(‘a’).
  addV(‘test’).property(id,’2’).
  addE(‘friend’).to(‘a’).
```

これは、バッチオペレーションごとに繰り返し表示されます。

バッチを使用すると、サーバーへの Gremlin ラウンドトリップごとに 1 つの頂点またはエッジを追加するよりもはるかに効率的です。

言語バリアント (GLV) クライアントを使用している場合は、最初にトラバーサルを作成することによってプログラム的にバッチを作成できます。次にそれに追加して、最後にそれを繰り返します。次に例を示します。

```
  t.addV(‘test’).property(id,’1’).as(‘a’)
  t.addV(‘test’).property(id,’2’)
  t.addE(‘friend’).to(‘a’)
  t.iterate()
```

可能であれば Gremlin 言語バリアントクライアントを使用することをお勧めします。ただし、文字列を連結してバッチを構築することでクエリをテキスト文字列として送信するクライアントと同様のことを実行できます。

クエリに基本的な HTTP ではなく Gremlin クライアントライブラリのいずれかを使用している場合、スレッドはすべて同じクライアント、クラスター、または接続プールを共有する必要があります。最高のスループット (接続プールのサイズ、Gremlin クライアントが使用するワーカースレッドの数などの設定) を得るために設定を調整する必要がある場合もあります。

# 作成時刻プロパティを使用したレコードの削除
<a name="best-practices-gremlin-prune"></a>

頂点のプロパティとして作成時刻を保存し、定期的に削除することで古いレコードを取り除くことができます。

特定の期間データを保存した後にグラフから削除する必要がある場合 (頂点の有効期限)、頂点の作成時にタイムスタンププロパティを保存できます。その後、特定の時間の前に作成されたすべての頂点に対する `drop()` クエリを定期的に発行できます。次に例を示します。

```
g.V().has(“timestamp”, lt(datetime('2018-10-11')))
```

# Groovy の時刻データに対する `datetime( )` メソッドの使用
<a name="best-practices-gremlin-datetime"></a>

Neptune は、Gremlin **Groovy** バリアントで送信されるクエリの日付と時刻を指定する `datetime` メソッドを提供します。これには、Gremlin コンソール、HTTP REST API を使用するテキスト文字列、Groovy を使用する他のシリアル化が含まれます。

**重要**  
これは Gremlin クエリを*テキスト文字列*として送信するメソッド*のみ*に当てはまります。Gremlin 言語バリアントを使用している場合は、その言語のネイティブな日付のクラスと関数を使用する必要があります。詳細については、次のセクション「[GLV 時刻データのネイティブの日付と時刻の使用](best-practices-gremlin-datetime-glv.md)」を参照してください。  
TinkerPop `3.5.2` ([Neptune エンジンリリース 1.1.1.0](engine-releases-1.1.1.0.md) で導入された) から、`datetime` は TinkerPop に欠かせない要素です。

`datetime` メソッドを使用して日付を保存および比較することができます。

```
g.V('3').property('date',datetime('2001-02-08'))
```

```
g.V().has('date',gt(datetime('2000-01-01')))
```

# GLV 時刻データのネイティブの日付と時刻の使用
<a name="best-practices-gremlin-datetime-glv"></a>

Gremlin 言語バリアント (GLV) を使用している場合は、Gremlin 時刻データのプログラミング言語によって提供されるネイティブな日時のクラスと関数を使用する必要があります。

公式の TinkerPop ライブラリはすべて Gremlin 言語バリアントライブラリです。
+  [Go](https://tinkerpop.apache.org/docs/current/reference/#gremlin-go) 
+  [Java](https://tinkerpop.apache.org/docs/current/reference/#gremlin-java) 
+  [Javascript](https://tinkerpop.apache.org/docs/current/reference/#gremlin-javascript) 
+  [.NET](https://tinkerpop.apache.org/docs/current/reference/#gremlin-dotnet) 
+  [Python](https://tinkerpop.apache.org/docs/current/reference/#gremlin-python) 

**重要**  
 このページの内容は、Gremlin 言語バリアントライブラリ (GLV) のみに当てはまります。Gremlin クエリをテキスト文字列として送信するメソッドを使用している場合は、Gremlin の datetime() 関数を使用する必要があります。これには、Gremlin コンソール、HTTP REST API を使用するテキスト文字列、またはドライバーを介して Gremlin 文字列を直接送信することが含まれます。



**Go**  
 以下に、ID「3」を持つ頂点の「date」という 1 つのプロパティを作成する Go の例の一部を示します。これは、Go の time.Now() 関数を使用して生成された日付となる値を設定します。

```
import ( "time" )

g.V('3').property('date', time.Now()).next();
```

Go を使用して Neptune に接続する完全な例については、「[Go を使用して Neptune DB インスタンスに接続する](https://docs.aws.amazon.com//neptune/latest/userguide/access-graph-gremlin-go.html)」を参照してください。

**Java**  
以下に、ID「`3`」を持つ頂点の「`date`」という 1 つのプロパティを作成する Java の例の一部を示します。Java `Date()` コンストラクタを使用して作成された日付となる値を設定します。

```
import java.util.date

g.V('3').property('date', new Date()).next();
```

Java を使用して Neptune に接続するための完全な例については、「[Java クライアントを使用して Neptune DB インスタンスに接続する](access-graph-gremlin-java.md)」を参照してください。

**Node.js (JavaScript)**  
以下に、ID「`3`」を持つ頂点の「`date`」という 1 つのプロパティを作成する JavaScript の例の一部を示します。Node.js `Date()` コンストラクタを使用して作成された日付となる値を設定します。

```
g.V('3').property('date', new Date()).next()
```

Node.js を使用して Neptune に接続するための完全な例については、「[Node.js を使用して Neptune DB インスタンスに接続する](access-graph-gremlin-node-js.md)」を参照してください。

**.NET (C\$1)**  
以下に、ID「`3`」を持つ頂点の「`date`」という 1 つのプロパティを作成する C\$1 の例の一部を示します。.NET `DateTime.UtcNow` プロパティを使用して作成された日付となる値を設定します。

```
Using System;

g.V('3').property('date', DateTime.UtcNow).next()
```

C\$1 を使用して Neptune に接続するための完全な例については、「[.NET を使用して Neptune DB インスタンスに接続する](access-graph-gremlin-dotnet.md)」を参照してください。

**Python**  
以下に、ID「`3`」を持つ頂点の「`date`」という 1 つのプロパティを作成する Python の例の一部を示します。Python `datetime.now()` メソッドを使用して作成された日付となる値を設定します。

```
import datetime

g.V('3').property('date',datetime.datetime.now()).next()
```

Python を使用して Neptune に接続するための完全な例については、「[Python を使用して Neptune DB インスタンスに接続する](access-graph-gremlin-python.md)」を参照してください。