evaluationStrategySPARQL クエリヒント - Amazon Neptune

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

evaluationStrategySPARQL クエリヒント

evaluationStrategy クエリヒントは、注釈が付けられたクエリのフラグメントを独立したユニットとして下部から評価するように Amazon Neptune クエリエンジンに指示します。つまり、前回の評価ステップからのソリューションは、クエリフラグメントの計算に使用されません。クエリフラグメントはスタンドアロンユニットとして評価され、生成されたソリューションは計算された後にクエリの残りの部分と結合されます。

evaluationStrategy クエリヒントを使用することは、(パイプライン化されていない) クエリプランをブロックすることを意味します。つまり、クエリヒントによって注釈が付けられたフラグメントのソリューションは、メインメモリでマテリアライズおよびバッファされます。特に注釈が付けられたクエリフラグメントが大量の結果を計算する場合、このクエリヒントを使用することによって、クエリの評価に必要なメインメモリの量が大幅に増加する可能性があります。

evaluationStrategy SPARQL ヒント構文

evaluationStrategy クエリヒントは、SPARQL クエリに含まれる 3 つのパターンとして指定されます。

わかりやすくするために、次の構文では、クエリに定義されて含まれる hint プレフィックスを使用して Neptune クエリヒント名前空間を指定します。

PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> hint:SubQuery hint:evaluationStrategy "BottomUp" .
利用可能なスコープ
  • hint:SubQuery

注記

このクエリヒントは、ネストされたサブクエリでのみサポートされています。

クエリヒントスコープの詳細については、「Neptune における SPARQL クエリヒントの範囲。」を参照してください。

evaluationStrategySPARQL ヒントの例

このセクションでは、evaluationStrategy クエリヒントを使用した場合と使用していない場合に記述されたクエリ、および関連する最適化を示します。

この例では、データセットに次の特性があることを前提としています。

  • 1,000 のエッジラベル :connectedTo が含まれています。

  • component ノードは、平均 100 の他の component ノードに接続されています。

  • ノード間の 4 つのホップの周期的な接続の標準的な数は、約 100 です。

クエリヒントなし

次の SPARQL クエリは、4 つのホップを通じて周期的に相互に接続される component ノードをすべて抽出します。

PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT * { ?component1 :connectedTo ?component2 . ?component2 :connectedTo ?component3 . ?component3 :connectedTo ?component4 . ?component4 :connectedTo ?component1 . }

Neptune クエリエンジンのアプローチは、次のステップを使用してこのクエリを評価することです。

  • グラフ内の 1,000 の connectedTo エッジをすべて抽出します。

  • 100 倍で展開します (100 は component2 からの発信 connectedTo エッジの数)。

    中間結果: 100,000 ノード。

  • 100 倍で展開します (100 は component3 からの発信 connectedTo エッジの数)。

    中間結果: 10,000,000 ノード。

  • サイクルを閉じるために 10,000,000 ノードをスキャンします。

この結果、一定量のメインメモリを持つクエリプランがストリーミングされます。

クエリヒントとサブクエリ

メインメモリスペースと高速コンピューティングのトレードオフを実現できます。evaluationStrategy クエリヒントを使用してクエリを書き換えることで、2 つの小さなマテリアライズされたサブセット間の結合をエンジンに計算させることができます。

PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT * { { SELECT * WHERE { hint:SubQuery hint:evaluationStrategy "BottomUp" . ?component1 :connectedTo ?component2 . ?component2 :connectedTo ?component3 . } } { SELECT * WHERE { hint:SubQuery hint:evaluationStrategy "BottomUp" . ?component3 :connectedTo ?component4 . ?component4 :connectedTo ?component1 . } } }

今後のパターンの入力として、前の 3 つのパターンの結果を反復的に使用しながら 3 つのパターンを順番に評価する代わりに、evaluationStrategy ヒントを使用すると、2 つのサブクエリを個別に評価することができます。この 2 つのサブクエリは、中間結果で 100,000 のノードを生成します。これは、最終出力を生成するために結合されます。

特に、より大規模なインスタンスタイプで Neptune を実行するとき、メインメモリにこれら 2 つの 100,000 サブセットを一時的に保管することにより、評価の時間を大幅に短縮するのと引き換えにメモリ使用量が増加します。