

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# `SERVICE` 확장을 사용하는 Neptune의 SPARQL 페더레이션된 쿼리
<a name="sparql-service"></a>

Amazon Neptune은 `SERVICE` 키워드를 사용하는 SPARQL 페더레이션된 쿼리 확장을 전적으로 지원합니다 (자세한 내용은 [SPARQL 1.1 연동 쿼리](https://www.w3.org/TR/sparql11-federated-query/) 참조).

`SERVICE` 키워드는 SPARQL 쿼리 엔진에게 원격 SPARQL 엔드포인트를 기준으로 쿼리의 일부분을 실행하여 최종 쿼리 결과를 구성하도록 지시합니다. `READ` 작업만 가능합니다. `WRITE` 및 `DELETE` 작업은 지원되지 않습니다. Neptune은 Virtual Private Cloud(VPC) 내에서 액세스할 수 있는 SPARQL 엔드포인트에 대해서만 페더레이션 쿼리를 실행할 수 있습니다. 그러나 VPC에서 리버스 프록시를 사용하여 VPC 내에서 외부 데이터 소스에 액세스할 수 있게 하는 것도 가능합니다.

**참고**  
SPARQL `SERVICE`를 사용하여 동일한 VPC에 있는 2개 이상의 Neptune 클러스터에 쿼리를 페더레이션하는 경우 모든 Neptune 클러스터가 서로 통신할 수 있도록 보안 그룹을 구성해야 합니다.

**중요**  
SPARQL 1.1 Federation은 외부 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*은 첫 번째 쿼리 패턴(*Q-1*)인 `?person rdf:type foaf:Person`을 평가하고 결과를 바탕으로 *Q-2*(`?person foaf:knows ?friend`)에서 `?person`을 해결한 다음, 결과 패턴을 `http://neptune-2:8182/sparql`의 *Neptune-2*에 전달합니다.

1. *Neptune-2*는 *Q-2*를 평가하고 그 결과를 *Neptune-1*에 다시 전송합니다.

1. *Neptune-1*은 두 패턴 모두에 대한 솔루션을 조인하여 결과를 고객에게 다시 전송합니다.

이 흐름은 다음 다이어그램에 나와 있습니다.

![\[평가 중인 SPARQL 연동 쿼리 패턴과 클라이언트에 다시 전송된 응답을 보여주는 흐름 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/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 보안 인증 정보를 검색하고, 이를 *Neptune-2*에 전달하여 쿼리의 두 번째 부분에 대해 권한을 부여할 수 없기 때문입니다.