SPARQL Queries
SQL para grafos RDF — pattern matching, FILTER, OPTIONAL, UNION, agregação
SPARQL é a linguagem de query do RDF. Em vez de tabelas e JOIN, você descreve padrões de triplas com variáveis (
?x, ?y). O matching contra o grafo retorna todos os bindings que satisfazem o padrão. JOIN é implícito — se uma variável aparece em duas posições, elas precisam coincidir. Anatomia de uma query SPARQL
PREFIX rdf:
PREFIX mtg:
PREFIX sch:
SELECT ?card ?name ?cmc # 1. Quais variáveis projetar
WHERE { # 2. Padrão de triplas a casar
?card a sch:Card .
?card sch:hasName ?name .
?card sch:hasCMC ?cmc .
FILTER (?cmc <= 3) # 3. Restrição em literal
}
ORDER BY ?cmc ?name # 4. Ordenação
LIMIT 10 # 5. Quantidade máxima
Forma de query
| Forma | Retorna | Quando usar |
|---|---|---|
| SELECT | Tabela (bindings de variáveis) | Igual SQL — listar/buscar |
| ASK | Booleano | "Existe alguma carta vermelha?" |
| CONSTRUCT | Novo grafo | Transformação / view materializada |
| DESCRIBE | Triplas sobre um recurso | "Me dá tudo sobre Lightning Bolt" |
Exemplo 1: todos os recursos de uma classe
# "Todas as cartas (instâncias da classe Card)"
PREFIX rdf:
PREFIX sch:
SELECT ?card WHERE {
?card rdf:type sch:Card .
# ou usando atalho: ?card a sch:Card .
}
# Equivalente SQL:
# SELECT id FROM card;
Exemplo 2: JOIN implícito via variável compartilhada
# "Cartas vermelhas do tipo Instant"
PREFIX mtg:
PREFIX sch:
SELECT ?card ?name WHERE {
?card a sch:Card .
?card sch:hasColor mtg:Red . # JOIN implícito
?card sch:hasType mtg:Instant . # JOIN implícito
?card sch:hasName ?name .
}
# Atalho com ; (mesmo sujeito):
SELECT ?card ?name WHERE {
?card a sch:Card ;
sch:hasColor mtg:Red ;
sch:hasType mtg:Instant ;
sch:hasName ?name .
}
Variável que aparece em duas posições é o JOIN. Em SQL você escreveria explícito; em SPARQL é grátis — mesma variável, mesmo binding.
Como escreveria query SPARQL para encontrar todas as cartas vermelhas?
SELECT ?card ?name WHERE { ?card a mtg:Card ; mtg:hasName ?name ; mtg:hasColor mtg:Red . } — o padrão de tripla "?card hasColor mtg:Red" filtra implicitamente. Note três coisas: (1) a é atalho para rdf:type; (2) ponto e vírgula encadeia predicados sobre o mesmo sujeito ?card; (3) sem WHERE/JOIN como em SQL — o grafo é navegado pelo pattern. Para cartas que são vermelhas OU azuis, use UNION ou FILTER (?color IN (...)).