

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Elegir entre FILTER, FILTER... IN y VALUES en sus consultas
<a name="best-practices-sparql-batch"></a>

Existen tres formas básicas para introducir valores en las consultas SPARQL:     `FILTER`,   `FILTER...IN`,   y   `VALUES`.

Por ejemplo, suponiendo que desee buscar los amigos de varias personas dentro de una única consulta. Con `FILTER`, podría estructurar su consulta de la siguiente manera:

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

Este devuelve todos los valores triples en el gráfico que tiene `?s` vinculado a `ex:person1` o `ex:person2` y que dispone de un borde saliente etiquetado como `foaf:knows`.

También puede crear una consulta mediante `FILTER...IN` que devuelve 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))}
```

También puede crear una consulta mediante `VALUES` que, en este caso, también devuelve 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}}
```

Aunque en muchos casos estas consultas son equivalente semánticamente, existen algunos casos en los que las dos variantes de `FILTER` difieren de la variante `VALUES`:
+ El primer caso es cuando introduce los valores duplicados; como, por ejemplo, introducir a la misma persona dos veces. En ese caso, la consulta `VALUES` incluye los valores duplicados en su resultado. Puede eliminar los duplicados de forma explícita mediante la incorporación de un `DISTINCT` a la cláusula `SELECT`. Sin embargo, podría haber situaciones en las que realmente quiere duplicados en los resultados de la consulta para la introducción de un valor redundante.

  Sin embargo, las versiones `FILTER` y `FILTER...IN` extraen solo una vez el valor cuando el mismo valor aparece varias veces.
+ El segundo caso está relacionado con el hecho de que `VALUES` siempre realiza una coincidencia exacta, mientras que `FILTER` podría aplicar el tipo de promoción y realizar coincidencias parciales en algunos casos.

  Por ejemplo, cuando incluya una cláusula literal como `"2.0"^^xsd:float` en sus valores, una consulta `VALUES` coincide totalmente con este valor literal, incluidos el valor literal y el tipo de datos.

  En cambio, `FILTER` produce una coincidencia parcial para estos valores numéricos. Las coincidencias podría incluir valores literales con el mismo valor, pero con distintos tipos de valores numéricos, como `xsd:double`.
**nota**  
No hay ninguna diferencia entre el comportamiento de`FILTER` y `VALUES` cuando se enumeran los valores literales de las cadena o de los URI.

Las diferencias entre `FILTER` y `VALUES` pueden afectar a la optimización y a la estrategia de evaluación de consulta resultante. A menos que su caso de uso requiera una coincidencia parcial, le recomendamos que utilice `VALUES`, ya que evita examinar los casos especiales relacionados con la conversión de tipos. Como resultado, `VALUES` produce a menudo una consulta más eficaz, que se ejecuta más rápido y es más económica.