

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

# 쿼리에서 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`입니다.