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
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
VALUESinclui as duplicatas no resultado. Você pode eliminar essas duplicações explicitamente adicionando umDISTINCTà cláusulaSELECT. 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
FILTEReFILTER...INextraem o valor somente uma vez quando o mesmo valor é exibido várias vezes. -
O segundo caso está relacionado ao fato de que
VALUESsempre realiza uma correspondência exata, enquantoFILTERpode 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:floatna cláusula de valores, uma consultaVALUEScorresponde exatamente a essa literal, incluindo valor de literal e tipo de dados.Por outro lado,
FILTERproduz 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, comoxsd:double.nota
Não há diferença entre o
VALUEScomportamentoFILTERe ao enumerar literais de string 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.