Я пытаюсь воспроизвести иерархию классов, отображаемую мне в Protege для онтологии OWL (owl.ttl), которую вы можете найти в стандартном расположении URI http://www.w3.org/2002/07/owl# для загрузки.
Я пытаюсь сделать это с помощью Jena API, загружая в 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?
========================================
Обновление: для анализа онтологии, которая является онтологией OWL2, мне пришлось отключить строгий режим, потому что Jena в настоящий момент несовместима с онтологиями 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.
Я не понимаю, что я здесь делаю не так, может быть, потому, что я разбираю онтологию OWL, и это само по себе сбивает Йену (независимо от того, рассматриваю ли это как онтологию RDFS или онтологию OWL)?