

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Scelta tra FILTER, FILTER...IN e VALUES nelle query
<a name="best-practices-sparql-batch"></a>

Sono disponibili tre tecniche di base per inserire valori in query SPARQL:   `FILTER`,   `FILTER...IN`   e   `VALUES`.

Ad esempio, potresti voler cercare gli amici di più persone con una singola query. Utilizzando `FILTER`, è possibile strutturare la query come segue:

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

Questo restituisce nel grafo tutte le triple che hanno `?s` associato a `ex:person1` o `ex:person2` e hanno un arco in uscita etichettato come `foaf:knows`.

Puoi anche creare una query utilizzando `FILTER...IN` che restituisce risultati equivalenti:

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

Puoi anche creare una query utilizzando `VALUES`, che in questo caso restituisce risultati equivalenti:

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

Anche se in molti casi queste query sono semanticamente equivalenti, vi sono alcuni casi in cui le due varianti `FILTER` differiscono dalla variante `VALUES`:
+ Il primo caso corrisponde a quando inserisci valori duplicati, come ad esempio inserire la stessa persona due volte. In questo caso, la query `VALUES` include il duplicato nel risultato. Puoi eliminare esplicitamente questi duplicati aggiungendo `DISTINCT` alla clausola `SELECT`. In alcuni casi, potresti volere i duplicati nei risultati della query per inserire valori ridondanti.

  Tuttavia, quando lo stesso valore appare più volte, le versioni `FILTER` e `FILTER...IN` lo estraggono una sola volta.
+ Il secondo caso è correlato al fatto che `VALUES` esegue sempre una corrispondenza esatta, mentre in alcuni casi `FILTER` potrebbe applicare la promozione di tipo ed eseguire corrispondenze parziali.

  Ad esempio, quando includi un valore letterale come `"2.0"^^xsd:float` nella clausola dei valori, una query `VALUES` esegue la corrispondenza esatta con questo valore letterale, inclusi il valore letterale e il tipo di dati.

  Al contrario, `FILTER` produce una corrispondenza parziale per questi valori letterali numerici. Le corrispondenze possono includere valori letterali con lo stesso valore ma con diversi tipi di dati numerici, come `xsd:double`.
**Nota**  
Non c'è differenza tra il `VALUES` comportamento `FILTER` e quando si enumerano stringhe letterali o. URIs

Le differenze tra `FILTER` e `VALUES` possono influenzare l'ottimizzazione e la strategia di valutazione query risultante. A meno che il caso d’uso richieda le corrispondenze parziali, consigliamo di utilizzare `VALUES` poiché evita di controllare i casi speciali relativi al casting del tipo. Di conseguenza, `VALUES` spesso produce una query più efficiente, più veloce e meno costosa.