

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

# `SERVICE` 拡張を使用した Neptune での SPARQL フェデレーティッドクエリ
<a name="sparql-service"></a>

Amazon Neptune は、`SERVICE` キーワードを使用する SPARQL フェデレーティッドクエリ拡張を完全にサポートします。(詳細については、[SPARQL 1.1 Federated Query](https://www.w3.org/TR/sparql11-federated-query/) を参照してください。)

`SERVICE` キーワードは、リモート SPARQL エンドポイントに対してクエリの一部を実行し、最終的なクエリ結果を構成するように SPARQL クエリエンジンに指示します。`READ` オペレーションのみ可能です。`WRITE` および `DELETE` オペレーションはサポートされていません。Neptune は、仮想プライベートクラウド (VPC) 内の SPARQL エンドポイントに対してのみフェデレーティッドクエリを実行できます。ただし、VPC のリバースプロキシを使用して、VPC 内で外部データソースにアクセスできるようにすることもできます。

**注記**  
SPARQL `SERVICE` を使用して、同じ VPC 内の 2 つ以上の Neptune クラスターにクエリをフェデレートする場合、それらのすべての Neptune クラスターが相互に通信できるようにセキュリティグループを設定する必要があります。

**重要**  
SPARQL 1.1 フェデレーションは、クエリとパラメータを外部 SPARQL エンドポイントに渡すときに、ユーザーに代わってサービスリクエストを行います。外部 SPARQL エンドポイントがアプリケーションのデータ処理とセキュリティ要件を満たしていることを確認するのはお客様の責任です。

## Neptune フェデレーティッドクエリの例
<a name="sparql-service-example-1"></a>

以下の簡単な例は、SPARQL フェデレーティッドクエリがどのように機能するかを示しています。

顧客が次のクエリを `http://neptune-1:8182/sparql` で*Neptune-1*に送信するとします。

```
SELECT * WHERE {
   ?person rdf:type foaf:Person .
   SERVICE <http://neptune-2:8182/sparql> {
       ?person foaf:knows ?friend .
    }
}
```

1. *Neptune-1*は最初のクエリパターン (`?person rdf:type foaf:Person`) を評価し (*Q 1*)、結果を使用して `?person` を *Q-2* (`?person foaf:knows ?friend`) で解決します。それから結果のパターンを `http://neptune-2:8182/sparql` で *Neptune-2* へ送ります。

1. *Neptune-2* は *Q-2* を評価し、結果を *Neptune-1* に返します。

1. *Neptune-1* は両方のパターンのソリューションに参加し、結果をお客様に返します。

このフローを、次の図に示します。

![\[評価中の SPARQL フェデレーティッドクエリパターンとクライアントへの応答を示すフロー図。\]](http://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/images/federated.png)


**注記**  
「デフォルトでは、オプティマイザは、クエリ実行のどの時点で `SERVICE` 命令が実行されるかを決定します。この配置は、[joinOrder](sparql-query-hints-joinOrder.md) クエリのヒントを使って上書きできます。

## Neptune でのフェデレーティッドクエリのアクセスコントロール
<a name="sparql-service-auth"></a>

Neptune は、認証および認可に AWS Identity and Access Management (IAM) を使用します。フェデレーティッドクエリのアクセスコントロールには、複数の Neptune DB インスタンスが含まれる場合があります。これらのインスタンスは、アクセスコントロールに関する要件が異なる場合があります。特定の状況では、これによってフェデレーティッドクエリの実行が制限される場合があります。

前のセクションで説明した簡単な例を考えてみましょう。*Neptune-1* は呼び出されたのと同じクレデンシャルで *Neptune 2* を呼び出します。
+ *Neptune-1* に IAM 認証と認可が必要な場合について、*Neptune-2* では必要ありません。ユーザーに必要であるのは、*Neptune-1* がフェデレーティッドクエリを行うための適切な IAM アクセス許可のみです。
+ *Neptune-1* と *Neptune-2* の両方で IAM 認証と認可が必要な場合は、両方のデータベースに IAM 許可をアタッチしてフェデレーティッドクエリを作成する必要があります。両方のクラスターも同じ AWS アカウントと同じリージョンに存在する必要があります。クロスリージョンまたはクロスアカウントフェデレーティッドクエリアーキテクチャは、現在サポートされていません。
+ ただし、 *Neptune-1* の IAM が有効ではなく、*Neptune-2* が有効な場合は、フェデレーティッドクエリを作成することはできません。これは、*Neptune-1* が IAM 認証情報を取得できず、クエリの 2 番目の部分を認可するために *Neptune-2* に渡すことができないためです。