

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

# SPARQL을 사용한 Neptune 모범 사례
<a name="best-practices-sparql"></a>

SPARQL 쿼리 언어를 Neptune과 함께 사용하는 경우 다음 모범 사례를 따르세요. SPARQL을 Neptune과 함께 사용하는 방법에 자세한 내용은 [SPARQL을 사용하여 Neptune 그래프에 액세스](access-graph-sparql.md)를 참조하세요.

**Topics**
+ [모든 명명된 그래프를 기본값으로 쿼리](best-practices-sparql-query.md)
+ [로드에 대해 명명된 그래프 지정](best-practices-sparql-graph.md)
+ [쿼리에서 FILTER, FILTER...IN 또는 VALUES 중 하나 선택](best-practices-sparql-batch.md)

# 모든 명명된 그래프를 기본값으로 쿼리
<a name="best-practices-sparql-query"></a>

Amazon Neptune은 3개마다 이름이 있는 그래프를 연결합니다. 기본 그래프는 이름이 있는 모든 그래프의 조합으로 정의됩니다.

`GRAPH`와 같은 `FROM NAMED` 키워드 또는 구문을 통해 그래프를 명시적으로 지정하지 않고 SPARQL 쿼리를 제출하는 경우 Neptune은 항상 DB 인스턴스의 모든 트리플을 고려합니다. 예를 들어 다음 쿼리는 Neptune SPARQL 엔드포인트의 모든 트리플을 반환합니다.

```
SELECT * WHERE { ?s ?p ?o }
```

1개 이상의 그래프에 나타나는 triples는 한 번만 반환합니다.

기본 그래프 사양에 대한 사항은 SPARQL 1.1 쿼리 언어 사양의 [RDF 데이터 세트](https://www.w3.org/TR/sparql11-query/#rdfDataset)를 참조하십시오.

# 로드에 대해 명명된 그래프 지정
<a name="best-practices-sparql-graph"></a>

Amazon Neptune은 3개마다 이름이 있는 그래프를 연결합니다. 트리플을 로드, 삽입 또는 업데이트할 때 이름이 있는 그래프를 지정하지 않으면 Neptune에서 URI(`http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph`)로 정의된 이름이 있는 대체 그래프를 사용합니다.

Neptune 대량 로더를 사용하는 경우 `parserConfiguration: namedGraphUri` 파라미터를 통해 모든 트리플(또는 네 번째 위치 공백이 있는 쿼드)에 사용할 명명된 그래프를 지정할 수 있습니다. Neptune 로더 `Load` 명령 구문에 대한 내용은 [Neptune 로더 명령](load-api-reference-load.md)을 참조하세요.

# 쿼리에서 FILTER, FILTER...IN 또는 VALUES 중 하나 선택
<a name="best-practices-sparql-batch"></a>

SPARQL 쿼리에서 값을 주입하는 세 가지 기본 방법은 `FILTER`, `FILTER...IN` 및 `VALUES`입니다.

예를 들어 단일 쿼리 내에서 여러 사람의 친구를 조회하려는 경우 `FILTER`를 사용하여 쿼리를 다음과 같이 구성할 수 있습니다.

```
  PREFIX ex: <https://www.example.com/>
  PREFIX foaf : <http://xmlns.com/foaf/0.1/>

  SELECT ?s ?o
  WHERE {?s foaf:knows ?o. FILTER (?s = ex:person1 || ?s = ex:person2)}
```

이렇게 하면 `?s`가 `ex:person1` 또는 `ex:person2`에 바인딩되어 있고 `foaf:knows`라는 나가는 엣지가 있는 그래프의 모든 트리플이 반환됩니다.

또한 다음과 같은 결과를 반환하는 `FILTER...IN`을 사용하여 쿼리를 생성할 수 있습니다.

```
  PREFIX ex: <https://www.example.com/>
  PREFIX foaf : <http://xmlns.com/foaf/0.1/>

  SELECT ?s ?o
  WHERE {?s foaf:knows ?o. FILTER (?s IN (ex:person1, ex:person2))}
```

이 경우에도 다음과 같은 결과를 반환하는 `VALUES`를 사용하여 쿼리를 생성할 수 있습니다.

```
  PREFIX ex: <https://www.example.com/>
  PREFIX foaf : <http://xmlns.com/foaf/0.1/>

  SELECT ?s ?o
  WHERE {?s foaf:knows ?o. VALUES ?s {ex:person1 ex:person2}}
```

대부분의 경우 이러한 쿼리는 구문상으로 동일하지만 두 `FILTER` 변형이 `VALUES` 변형과 다른 경우도 있습니다.
+ 첫 번째 경우는 동일한 사람을 두 번 주입하는 경우와 같이 중복 값을 주입할 때입니다. 이 경우 `VALUES` 쿼리가 결과에 중복 항목을 포함합니다. `DISTINCT` 절에 `SELECT`를 추가하여 명시적으로 이러한 중복 항목을 제거할 수 있습니다. 그러나 중복 값 주입을 위해 쿼리 결과에 실제로 중복 항목을 원하는 경우도 있습니다.

  그러나 `FILTER` 및 `FILTER...IN` 버전은 동일한 값이 여러 번 나타날 때 한 번만 값을 추출합니다.
+ 두 번째 경우는 `VALUES`에서는 항상 정확한 일치를 수행하지만 `FILTER`에서는 일부 경우에 유형 승격을 적용하고 퍼지 일치를 수행한다는 사실과 관련이 있습니다.

  예를 들어 값 절에 `"2.0"^^xsd:float`와 같은 리터럴을 포함할 때 `VALUES` 쿼리는 리터럴 값 및 데이터 유형을 포함하여 이 리터럴과 정확하게 일치시킵니다.

  반대로 `FILTER`는 이러한 숫자 리터럴에 대한 퍼지 일치를 생성합니다. 이러한 일치에는 값이 동일하지만 숫자 데이터 유형은 서로 다른 리터럴이 포함됩니다(예: `xsd:double`).
**참고**  
문자열 리터럴 또는 URI를 열거할 때 `FILTER` 동작과 `VALUES` 동작 간에는 차이가 없습니다.

`FILTER`와 `VALUES` 간의 차이는 최적화 및 결과 쿼리 평가 전략에 영향을 줄 수 있습니다. 사용 사례에서 퍼지 일치를 원하는 경우가 아니면 유형 변환과 관련된 특별한 경우를 고려하지 않아도 되는 `VALUES`를 사용하는 것이 좋습니다. 따라서 더 빨리 실행하고 비용이 덜 드는 보다 효율적인 쿼리를 생성하는 것은 `VALUES`입니다.