Eu estou usando a API OWL para raciocinar sobre ontologia criada no Protege. Eu estou lidando com a consulta de exemplo de API OWL DL: http://sourceforge.net/p/owlapi/code/ci/aef6981535f07a2d0d44c394b9f4d5415f36025a/tree/contract/src/test/java/org/coode/owlapi/examples/DLQueryExample.java. Eu acho que este exemplo fornecefuncionalidade equivalente à guia Consulta DL no Protege. Mas, na verdade, existem algumas diferenças significativas: eu preciso obter as informações (subclasse, superclasse, etc.) de uma classe anônima, que é definida por um conjunto de indivíduos (ex {Member1, Member2 ...}) ou em outro caminho. No Protege, essa consulta retorna o resultado correto, mas essa consulta no Exemplo de consulta Dl da API OWL retorna [NOTHING]. Existe uma maneira de manipular classes anônimas na API OWL? Agradecemos antecipadamente por responder.
Respostas:
3 para resposta № 1Supondo que você esteja usando a classe DLQueryExample
como tal, sem modificações.
Você precisa usar um raciocinador diferente dopadrão um. Olhe para a linha 151, a implementação usa o raciocinador estrutural construído na OWL-API. Esse raciocinador é limitado e não é capaz de processar expressões de classe complexas como as suas.
Como corrigi-lo:
Use um raciocinador mais avançado como Eremita. Faça o download e coloque o jar no seu classpath, então substitua o código na linha 151 por:
OWLReasonerFactory reasonerFactory = new Reasoner.ReasonerFactory();
Você precisará importar o pacote org.semanticweb.HermiT.Reasoner
. Agora você usará o Hermit para processar suas consultas. Experimentar Pizza and (hasTopping some CheeseTopping)
, deve funcionar!