

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在您的查詢中選擇 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` 通常會產生更有效率的查詢，執行速度更快但價格低廉。