Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Choisir entreFILTER,FILTER... DANS et VALUES dans vos requêtes
Il existe trois méthodes de base pour injecter des valeurs dans les SPARQL requêtes : FILTER
FILTER...IN
,, etVALUES
.
Par exemple, imaginons que vous souhaitiez rechercher les amis de plusieurs personnes dans une seule requête. En utilisant FILTER
, vous pouvez structurer votre requête comme suit :
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)}
Cette opération renvoie tous les triplets du graphe dans lesquels ?s
est lié à ex:person1
ou ex:person2
et qui ont un arc sortant intitulé foaf:knows
.
Vous pouvez également créer une requête en utilisant FILTER...IN
qui renvoie des résultats équivalents :
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))}
Vous pouvez également créer une requête en utilisant VALUES
qui, dans ce cas, renvoie également des résultats équivalents :
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}}
Bien que, dans bien des cas, ces requêtes soient équivalentes sémantiquement, il y a certains cas où les deux variantes FILTER
diffèrent de la variante VALUES
:
-
Le premier cas est lorsque vous injectez des valeurs en double, telles que l'injection de la même personne deux fois. Dans ce cas, la requête
VALUES
inclut les doublons dans votre résultat. Vous pouvez explicitement éliminer ces doublons en ajoutant unDISTINCT
à la clauseSELECT
. Toutefois, dans certaines situations, vous souhaiterez peut-être conserver les doublons dans les résultats des requêtes à des fins d’injection des valeurs redondantes.Cependant, les versions
FILTER...IN
etFILTER
extraient la valeur une seule fois lorsque la même valeur apparaît plusieurs fois. -
Le deuxième cas est lié au fait que
VALUES
génère toujours une correspondance exacte, alors queFILTER
pourrait appliquer une promotion de type et réaliser des correspondances partielles dans certains cas.Par exemple, lorsque vous incluez une valeur littérale comme
"2.0"^^xsd:float
dans votre clause VALUES, une requêteVALUES
établit une correspondance exacte avec cette valeur littérale, y compris la valeur littérale et le type de données.En revanche,
FILTER
produit une correspondance partielle pour ces littéraux numériques. Les correspondances peuvent inclure des littéraux avec la même valeur mais des types de données numériques, par exemplexsd:double
.Note
Il n'y a aucune différence entre le
VALUES
comportementFILTER
et lors de l'énumération des littéraux de chaîne ou. URIs
Les différences entre FILTER
et VALUES
peuvent affecter l'optimisation et la stratégie d'évaluation de requête qui en résulte. Sauf si votre cas d'utilisation nécessite des correspondances partielles, nous vous recommandons d'utiliser VALUES
car cela évite d’examiner les cas spéciaux relatifs au transtypage. En conséquence, VALUES
produit souvent une requête plus efficace qui s'exécute plus rapidement et qui coûte moins cher.