

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

# Amazon Neptune のクエリプランキャッシュ
<a name="access-graph-qpc"></a>

 クエリが Neptune に送信されると、クエリ文字列が解析、最適化され、クエリプランに変換されて、エンジンによって実行されます。アプリケーションは、多くの場合に、異なる値でインスタンス化された一般的なクエリパターンによってバックアップされます。クエリプランキャッシュは、クエリプランをキャッシュすることで全体的なレイテンシーを低減し、このような繰り返しパターンの解析と最適化を回避できます。

 クエリプランキャッシュは、パラメータ化されていないクエリとパラメータ化されたクエリの両方の **OpenCypher** クエリに使用できます。READ では、HTTP と Bolt に対して有効になっています。OC ミューテーションクエリではサポート**されていません**。Gremlin または SPARQL クエリではサポート**されていません**。

## クエリプランキャッシュを強制的に有効または無効にする方法
<a name="access-graph-qpc-enable"></a>

 クエリプランキャッシュは、低レイテンシーのパラメータ化されたクエリに対してデフォルトで有効になっています。パラメータ化されたクエリのプランは、レイテンシーがしきい値の **100 ミリ秒**を下回った場合にのみキャッシュに保存されます。この動作は、クエリレベルのクエリヒント `QUERY:PLANCACHE` によって、クエリごとに (パラメータ化されているかどうかにかかわらず) 上書きできます。`USING` 句と併用する必要があります。クエリヒントは、値として `enabled` または `disabled` を受け入れます。

------
#### [ AWS CLI ]

プランのキャッシュまたは再利用を強制する:

```
aws neptunedata execute-open-cypher-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1"
```

パラメータの入力例:

```
aws neptunedata execute-open-cypher-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
  --parameters '{"arg": 123}'
```

強制プランはキャッシュも再利用もされません。

```
aws neptunedata execute-open-cypher-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "Using QUERY:PLANCACHE \"disabled\" MATCH(n) RETURN n LIMIT 1"
```

詳細については、 コマンドリファレンスの [execute-open-cypher-query](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-query.html) AWS CLI を参照してください。

------
#### [ SDK ]

```
import boto3
from botocore.config import Config

client = boto3.client(
    'neptunedata',
    endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
    config=Config(read_timeout=None, retries={'total_max_attempts': 1})
)

# Forcing plan to be cached or reused
response = client.execute_open_cypher_query(
    openCypherQuery='Using QUERY:PLANCACHE "enabled" MATCH(n) RETURN n LIMIT 1'
)

print(response['results'])
```

他の言語の AWS SDK の例については、「」を参照してください[AWS SDK](access-graph-opencypher-sdk.md)。

------
#### [ awscurl ]

プランのキャッシュまたは再利用を強制する:

```
awscurl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  --region {{us-east-1}} \
  --service neptune-db \
  -X POST \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1"
```

**注記**  
この例では、 AWS 認証情報が 環境で設定されていることを前提としています。{{us-east-1}} を Neptune クラスターのリージョンに置き換えます。

------
#### [ curl ]

プランのキャッシュまたは再利用を強制する:

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1"
```

パラメータの入力例:

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
  -d "parameters={\"arg\": 123}"
```

強制プランはキャッシュも再利用もされません。

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=Using QUERY:PLANCACHE \"disabled\" MATCH(n) RETURN n LIMIT 1"
```

------

## プランがキャッシュに保存されているかどうかを判断する方法
<a name="access-graph-qpc-status"></a>

 HTTP READ の場合は、クエリが送信され、プランがキャッシュに保存されると、`explain` はクエリプランのキャッシュに関連する詳細を表示します。

------
#### [ AWS CLI ]

```
aws neptunedata execute-open-cypher-explain-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \
  --explain-mode details
```

詳細については、 コマンドリファレンスの [execute-open-cypher-explain-query](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-explain-query.html) AWS CLI を参照してください。

------
#### [ SDK ]

```
import boto3
from botocore.config import Config

client = boto3.client(
    'neptunedata',
    endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
    config=Config(read_timeout=None, retries={'total_max_attempts': 1})
)

response = client.execute_open_cypher_explain_query(
    openCypherQuery='Using QUERY:PLANCACHE "enabled" MATCH(n) RETURN n LIMIT 1',
    explainMode='details'
)

print(response['results'].read().decode('utf-8'))
```

他の言語の AWS SDK の例については、「」を参照してください[AWS SDK](access-graph-opencypher-sdk.md)。

------
#### [ awscurl ]

```
awscurl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  --region {{us-east-1}} \
  --service neptune-db \
  -X POST \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \
  -d "explain=details"
```

**注記**  
この例では、 AWS 認証情報が 環境で設定されていることを前提としています。{{us-east-1}} を Neptune クラスターのリージョンに置き換えます。

------
#### [ curl ]

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \
  -d "explain=details"
```

------

プランがキャッシュされている場合、`explain`出力には以下が表示されます。

```
Query: <QUERY STRING>
Plan cached by request: <REQUEST ID OF FIRST TIME EXECUTION>
Plan cached at: <TIMESTAMP OF FIRST TIME EXECUTION>
Parameters: <PARAMETERS, IF QUERY IS PARAMETERIZED QUERY>
Plan cache hits: <NUMBER OF CACHE HITS FOR CACHED PLAN>
First query evaluation time: <LATENCY OF FIRST TIME EXECUTION>

The query has been executed based on a cached query plan. Detailed explain with operator runtime statistics can be obtained by running the query with plan cache disabled (using HTTP parameter planCache=disabled).
```

 Bolt を使用する場合について、説明機能はサポートされていません。

## エビクション
<a name="access-graph-qpc-eviction"></a>

 クエリプランは、キャッシュの有効期限 (TTL) またはキャッシュに保存されたクエリプランの最大数に達したときにエビクトされます。クエリプランがヒットすると、TTL が更新されます。デフォルトは次のとおりです。
+  1,000 – インスタンスごとにキャッシュに保存できるプランの最大数。
+  TTL – 300,000 ミリ秒または 5 分。キャッシュヒットは TTL を再起動し、5 分にリセットします。

## プランがキャッシュに保存されない原因となる条件
<a name="access-graph-qpc-conditions"></a>

 クエリプランキャッシュは、次の条件下では使用されません。

1.  クエリヒント `QUERY:PLANCACHE "disabled"` を使用してクエリが送信された場合。クエリを再実行して `QUERY:PLANCACHE "disabled"` を削除し、クエリプランキャッシュを有効にできます。

1.  送信されたクエリがパラメータ化されたクエリではなく、ヒント `QUERY:PLANCACHE "enabled"` が含まれていない場合。

1.  クエリ評価時間がレイテンシーのしきい値より長い場合、クエリはキャッシュに保存されず、クエリプランキャッシュのメリットが得られない長時間実行クエリであるとみなされます。

1.  クエリに結果を返さないパターンが含まれている場合。
   +  つまり、指定されたラベルを持つノードがゼロの `MATCH (n:nonexistentLabel) return n` の場合です。
   +  つまり、`name=abcde` を含むノードがゼロ個の場合は、`parameters={"param": "abcde"}` で `MATCH (n {name: $param}) return n` を使用します。

1.  クエリパラメータが `list` や `map` などの複合型である場合。

   ```
   curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
     -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
     -d "parameters={\"arg\": [1, 2, 3]}"
   
   curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
     -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
     -d "parameters={\"arg\": {\"a\": 1}}"
   ```

1.  クエリパラメータがデータロードまたはデータ挿入オペレーションに含まれていない文字列である場合。例えば、`CREATE (n {name: "X"})` が `"X"` を挿入するために実行されている場合、`RETURN "X"` はキャッシュに保存されますが、`"Y"` が挿入されておらずデータベースに存在しないため `RETURN "Y"` はキャッシュに保存されません。