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

FormaRetornaQuando usar
SELECTTabela (bindings de variáveis)Igual SQL — listar/buscar
ASKBooleano"Existe alguma carta vermelha?"
CONSTRUCTNovo grafoTransformação / view materializada
DESCRIBETriplas 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 (...)).