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) }
Foi útil?

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 .
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top