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 traFILTER,FILTER... IN e nelle tue interrogazioni VALUES
Esistono tre modi fondamentali per inserire valori nelle SPARQL query: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 aggiungendoDISTINCT
alla clausolaSELECT
. 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
eFILTER...IN
lo estraggono una sola volta. -
Il secondo caso è correlato al fatto che
VALUES
esegue sempre una corrispondenza esatta, mentre in alcuni casiFILTER
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 queryVALUES
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, comexsd:double
.Nota
Non c'è differenza tra il
VALUES
comportamentoFILTER
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.