Я пытаюсь воспроизвести иерархию классов, представленную мне в Protege для онтологии OWL (owl.ttl), которую вы можете найти в стандартном местоположении URI http://www.w3.org/2002/07/owl# для загрузки.Попытка понять иерархию классов Jena
Я пытаюсь сделать это с помощью API Jena, загрузив его в OntModel, а затем запустив корневые классы иерархии. Затем я хочу вернуться к иерархии.
Проблема, которую я получаю, заключается в том, что когда я звоню, чтобы получить корневые классы иерархии, я получаю нулевые результаты. Таким образом, у меня нет корневых классов, из которых можно восстановить и построить иерархию.
===========================================
Когда я загружаю онтологию OWL в http://www.w3.org/2002/07/owl# в Protege, я получаю отличную иерархию классов абсолютно нормально. Тем не менее, когда я загружаю в обоих мотивированного или непродуманной модели в Йене, я не иерархия классов, как так:
OntModel reasonedModel = com.hp.hpl.jena.rdf.model.ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MINI_RULE_INF);
OntModel unreasonedModel = com.hp.hpl.jena.rdf.model.ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
// <Code that loads in the ontology syntax into model skipped here>
// Now get the sets of root classes
reasonedModel.listHierarchyRootClasses(); // Returns empty set
unreasonedModel.listHierarchyRootClasses(); // Returns empty set
Оба звонки по мотивированному или непродуманной модели возвращает нулевой результат.
================================================================================================================================================
Теперь я пробую что-то еще. Я знаю, что rdfs: Resource всегда является классом верхнего уровня для любой модели RDFS/OWL. Так что, когда я делаю:
OntClass topLevel = reasonedModel.getOntClass("http://www.w3.org/2000/01/rdf-schema#Resource");
// Get direct subclasses...
topLevel.listSubClasses(true);
И рекурсию отсюда вниз, я получаю полную иерархию классов, в том числе предполагаемых отношений, потому что я выбрал мотивированную модель.
Вопрос в том, подходит ли последний подход к этому? Разве я не могу попросить Йену рассказать мне, что представляют собой классы корневого уровня модели, а затем я расскажу Йене, что это rdfs: Resource?
========================================
Update: Чтобы разобрать онтологию, которая является онтологией OWL2, мне пришлось установить строгий режим, потому что Йена не совместима с онтологиями OWL2 на данный момент (я использую версию 2.7.4).
Когда я вызываю .listHierarchyRootClasses() с OWL_MEM или RDFS_MEM, я возвращаю нулевые корневые классы. Если я называю .listClasses() и найти все классы без супер-классов, чтобы найти корни, в RDFS_MEM я получаю следующую иерархию:
Class [http://www.w3.org/2002/07/owl#Axiom]
Class [http://www.w3.org/2002/07/owl#NegativePropertyAssertion]
Class [http://www.w3.org/2002/07/owl#Ontology]
Class [http://www.w3.org/2002/07/owl#AllDisjointClasses]
Class [http://www.w3.org/2002/07/owl#Annotation]
Class [http://www.w3.org/2002/07/owl#AllDifferent]
Class [http://www.w3.org/2002/07/owl#AllDisjointProperties]
Class [http://www.w3.org/2002/07/owl#OntologyProperty]
Class [http://www.w3.org/2002/07/owl#AnnotationProperty]
Class [http://www.w3.org/2002/07/owl#DatatypeProperty]
Class [http://www.w3.org/2002/07/owl#ObjectProperty]
Class [http://www.w3.org/2002/07/owl#InverseFunctionalProperty]
Class [http://www.w3.org/2002/07/owl#IrreflexiveProperty]
Class [http://www.w3.org/2002/07/owl#AsymmetricProperty]
Class [http://www.w3.org/2002/07/owl#TransitiveProperty]
Class [http://www.w3.org/2002/07/owl#SymmetricProperty]
Class [http://www.w3.org/2002/07/owl#ReflexiveProperty]
Class [http://www.w3.org/2002/07/owl#DeprecatedProperty]
Class [http://www.w3.org/2002/07/owl#FunctionalProperty]
Class [http://www.w3.org/2002/07/owl#DeprecatedClass]
Class [http://www.w3.org/2002/07/owl#Class]
Class [http://www.w3.org/2002/07/owl#Restriction]
Class [http://www.w3.org/2002/07/owl#DataRange]
Class [http://www.w3.org/2002/07/owl#NamedIndividual]
Class [http://www.w3.org/2002/07/owl#Nothing]
В OWL_MEM я получаю следующее:
Class [http://www.w3.org/2002/07/owl#NamedIndividual]
Class [http://www.w3.org/2002/07/owl#Nothing]
Опять же, ни одна из которых не отражает ту же иерархию, что и при загрузке в Protege.
Я не совсем понимаю, что я здесь делаю неправильно, не так ли, потому что я разбираю OTL-онтологию, и это само по себе вызывает смущение Йену (независимо от того, рассматриваете ее как онтологию RDFS или онтологию OWL)?
Обновление: теперь я проверил пример иерархии классов, предоставленный исходным кодом Jena. Он отлично работает в онтологии, которая не является онтологией OWL. – MarkS