OWL & SHACL
Inferência (OWL, open-world) vs Validação (SHACL, closed-world) — não são alternativas, são complementos
A confusão clássica: as pessoas tratam OWL e SHACL como "duas formas de fazer schema RDF". Não são. OWL infere fatos novos sob o pressuposto de mundo aberto. SHACL valida o grafo contra contratos sob mundo fechado. Usar OWL onde você queria SHACL = bug silencioso que nunca falha.
Em uma tabela
| OWL | SHACL | |
|---|---|---|
| Propósito | Inferir fatos novos | Validar conformidade |
| Pressuposto do mundo | Open-world (OWA) | Closed-world (CWA) |
| Falta de fato significa | "Ainda não sabemos" | Os dados são avaliados como estão; o que falta só viola se alguma constraint exigia (sh:minCount) |
| Unique Name Assumption | NÃO (URIs diferentes podem ser a mesma coisa) | SIM (cada URI é único) |
| Quando dispara | Toda vez que reasoner roda | Quando você valida explicitamente |
| Output | Mais triplas (fatos inferidos) | Report de violações |
| Análogo familiar | "View materializada" — gera dados derivados | "CHECK constraint" — rejeita dados ruins |
A pergunta clássica de entrevista: "Regra: todo Deck precisa ter ≥99 cartas. Implementa em OWL ou SHACL?" — SHACL. Por quê? OWL não rejeita: sob mundo aberto, "Deck X só tem 60 cartas" é interpretado como "as outras 39 ainda não foram afirmadas". OWL não acusa. SHACL acusa.
Quando usar cada
| Use OWL para | Use SHACL para |
|---|---|
| Hierarquia de classes (Creature ⊑ Card) | "Card tem que ter exatamente 1 nome" |
| Inferência transitiva (ancestral, descendente) | "Mana cost só permite letras WUBRGC e dígitos" |
| Domínio/range de propriedade | "Deck precisa de ≥60 cartas, ≤2 wins" |
| Identidade implícita (owl:sameAs) | Cardinalidade exata (≥, ≤, =) |
| Reasoner (Pellet, HermiT) deduz fatos — materializando antes (forward-chaining) ou na consulta (backward-chaining) | Validação no pipeline ETL |
Onde o SKOS entra
OWL e SHACL não são as únicas ferramentas do stack — SKOS (Simple Knowledge Organization System) organiza vocabulários controlados, taxonomias e tesauros. A pergunta que separa todas é a mesma: o que significa um fato estar faltando?
| Você quer | Ferramenta | Fato faltando significa |
|---|---|---|
| Deduzir estrutura não declarada | OWL + reasoner | Desconhecido — pode existir |
| Verificar se os dados obedecem regras | SHACL | Violação, se a regra exigia |
| Perguntar o que está lá | SPARQL | Simplesmente não retorna |
| Organizar vocabulário para indexar e buscar | SKOS | — |
SKOS foi desenhado para não precisar de reasoner.
skos:broader deliberadamente não é transitivo; skos:broaderTransitive existe como propriedade separada exatamente para que tesauros funcionem sob SPARQL puro (na prática, skos:broader+ com property path resolve). E as condições de integridade do SKOS (S13: prefLabel/altLabel/hiddenLabel disjuntos; S14: um prefLabel por idioma; S27: related disjunto de broaderTransitive; S46: exactMatch disjunto de broadMatch/relatedMatch) são condições a verificar, não axiomas a deduzir — algumas, como a cardinalidade por idioma da S14, nem sequer são expressáveis em OWL. Por isso qSKOS e todo validador SKOS são construídos sobre SPARQL. Diferença entre OWL e SHACL em uma frase
OWL infere fatos novos sob mundo aberto; SHACL valida o grafo contra contratos sob mundo fechado. OWL é sobre "o que mais é verdade?", SHACL é sobre "isso aqui está conforme?". Em produção, você usa os dois: OWL para enriquecer o grafo com fatos derivados, SHACL para garantir que dados ingeridos respeitam invariantes do domínio.