

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Como escolher entre FILTER, FILTER...IN e VALUES em suas consultas
<a name="best-practices-sparql-batch"></a>

Existem três maneiras básicas para injetar valores em consultas SPARQL:   `FILTER`,   `FILTER...IN`   e   `VALUES`.

Por exemplo, suponha que você queira pesquisar os amigos de várias pessoas em uma única consulta. Usando `FILTER`, você pode estruturar a consulta da seguinte forma:

```
  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)}
```

Isso retorna todos os triplos no gráfico que têm `?s` vinculado a `ex:person1` ou a `ex:person2` e uma borda de saída chamada `foaf:knows`.

Você também pode criar uma consulta usando `FILTER...IN` que retorna resultados equivalentes:

```
  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))}
```

Você também pode criar uma consulta usando `VALUES` que, nesse caso, também retorna resultados equivalentes:

```
  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}}
```

Embora em muitos casos essas consultas sejam semanticamente equivalentes, há alguns casos em que as duas variantes `FILTER` diferem da variante `VALUES`:
+ O primeiro caso é quando você injeta valores duplicados, como injetar a mesma pessoa duas vezes. Nesse caso, a consulta `VALUES` inclui as duplicatas no resultado. Você pode eliminar essas duplicações explicitamente adicionando um `DISTINCT` à cláusula `SELECT`. No entanto, pode haver situações em que você realmente quer duplicações nos resultados da consulta de injeção de valor redundante.

  No entanto, as versões `FILTER` e `FILTER...IN` extraem o valor somente uma vez quando o mesmo valor é exibido várias vezes.
+ O segundo caso está relacionado ao fato de que `VALUES` sempre realiza uma correspondência exata, enquanto `FILTER` pode aplicar uma promoção de tipo e fazer correspondência difusa em alguns casos.

  Por exemplo, quando você inclui um literal, como `"2.0"^^xsd:float` na cláusula de valores, uma consulta `VALUES` corresponde exatamente a essa literal, incluindo valor de literal e tipo de dados.

  Por outro lado, `FILTER` produz uma correspondência difusa para esses literais numéricos. As correspondências podem incluir literais com o mesmo valor, mas com diferentes tipos de dados numéricos, como `xsd:double`.
**nota**  
Não há diferença entre o comportamento de `FILTER` e de `VALUES` ao enumerar literais de strings ou URIs.

As diferenças entre `FILTER` e `VALUES` podem afetar a otimização e a estratégia de avaliação de consulta resultante. A não ser que seu caso de uso precise de correspondência difusa, recomendamos usar `VALUES` porque ele evita olhar para casos especiais relacionados a conversão do tipo. Como resultado, `VALUES` muitas vezes produz uma consulta mais eficiente cuja execução é mais rápida e mais econômica.