Como vincular uma variável a um item consultado no SPARQL
-
21-09-2019 - |
Pergunta
Nesta consulta Sparql simples, recebo uma lista de assuntos cujo objeto é 42
SELECT ?v WHERE { ?v ?p 42 }
Se eu adicionar? P como uma variável
SELECT ?v ?p WHERE { ?v ?p 42 }
Vou obter duas entidades por linha, o assunto e o predicado. E se eu quisesse três entidades, incluindo as 42? Algo como:
SELECT ?v ?p ?m WHERE { ?v ?p (42 as m) }
Solução
O padrão SPARQL 1.0 realmente não permite isso. Pode haver algumas extensões específicas da implementação para fazê-lo.
Como solução alternativa, se os dados contiverem um triplo com 42 como um objeto literal, você poderá fazê -lo, por exemplo, assim:
SELECT ?v ?p ?m { ?v ?p 42, ?m FILTER(?m=42)}
que é equivalente a
SELECT ?v ?p ?m WHERE { ?v ?p 42 . ?v ?p ?m FILTER(?m=42)}
Como você pode escrever padrões de gráficos compartilhando o mesmo assunto e predicado com a notação da lista de objetos de vírgula, e o WHERE
A palavra -chave é opcional.
Para eficiência, você deseja usar padrões de gráficos básicos para reduzir o triplo de trabalho para um conjunto menor e apenas aplicar expressões de filtro para podar ainda mais os resultados.
Outras dicas
Outra variante é usar o bind, por exemplo:
SELECT ?v ?p ?m
WHERE {
BIND(42 AS ?m)
?v ?p ?m
}
A instrução Bind simplesmente adiciona uma ligação para? M, que pode ser selecionado para o conjunto de resultados.
No SPARQL 1.1, você pode usar Valores por esta. Você escreveria
SELECT ?v ?p ?m WHERE {
values ?m { 42 }
?v ?p ?m
}
Você pode realizar de duas maneiras usando palavras -chave de ligação, bem como filtro
Usando ligações
SELECT ?v ?p ?m
WHERE { ?v ?p ?m}
BINDINGS ?m {(42)}
Usando filtro
SELECT ?v ?p ?m
WHERE {
?v ?p ?m
FILTER (?m = 42)
}
select ?v ?p ?m where { ?v ?p ?m . FILTER( ?m = 42 ) }
Eu sei que isso é redondo, mas acredito que isso é factível com uma subconsulta.
Este é um padrão útil para ajudá -lo a trabalhar na consulta no estreito, antes de deixá -lo soltar em todo o conjunto de dados:
SELECT ?v ?p ?m WHERE {
{ SELECT 42 as ?m WHERE { } }
?v ?p ?m .
}