Попытка понять иерархию классов Йены

Я пытаюсь воспроизвести иерархию классов, отображаемую мне в 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)?


person MarkS    schedule 02.11.2015    source источник
comment
Обновление: теперь я протестировал пример иерархии классов, предоставленный с исходным кодом Jena. Он отлично работает с онтологией, отличной от онтологии OWL.   -  person MarkS    schedule 03.11.2015


Ответы (2)


listHierarchyRootClasses () указывает в своем javadoc, что корень, который он будет использовать, - это owl: Thing. Таким образом, он не эквивалентен подходу, который вы использовали позже и который работает с этой онтологией.

Обратите внимание, что онтология, которую вы используете, очень специфична, поскольку это онтология, моделирующая части самого языка. В большинстве онтологий правильной стратегией является использование owl: Thing.

person Ignazio    schedule 02.11.2015
comment
Привет, Игнацио - спасибо за ответ, оцените, что это сложная или специализированная тема. Я могу подтвердить, что listHierarchyRootClasses () не возвращает owl: Thing при разборе онтологии совы - возможно, это потому, что, как вы говорите, это сама онтология OWL. Проблема в том, что это зависимость всех онтологий OWL, и это настолько беспокоит, что ее очень сложно проанализировать. - person MarkS; 02.11.2015
comment
Нет, обычные онтологии совы не импортируют эту онтологию - если вы проверите комментарии внутри, авторы заявят, что онтологии совы должны / не должны / импортировать ее, поскольку это заставит их совмещать полные онтологии. Языковые примитивы кодируются непосредственно во вспомогательных инструментах, поэтому обычно они не нужны в явном содержании. - person Ignazio; 02.11.2015
comment
Я обновил свой пост своими открытиями после некоторых экспериментов. Оцените комментарий о встроенных словарных объектах, которые могут сбить с толку библиотеку, поэтому я буду тестировать с онтологией на основе OWL, которая не является самой онтологией OWL! :) - person MarkS; 02.11.2015
comment
Между прочим - я бы подумал, что онтология OWL сама по себе является онтологией RDFS, которая определяет классы OWL (которые все являются rdfs: подклассами классов?). Так что на самом деле я все еще ожидаю, что .listHierarchyRootClasses () будет работать при загрузке его как RDFS OntModel - но вы все равно можете быть правы, это все еще может сбивать с толку библиотеку. - person MarkS; 02.11.2015

Игнацио был прав - я пробовал использовать стандартный конструктор иерархии классов, включенный в Jena, который вы можете найти на GitHub здесь: https://github.com/apache/jena/blob/master/jena-core/src-examples/jena/examples/ontology/classHierarchy/ClassHierarchy.java.

Это работает, если анализируемая онтология не является онтологией OWL. Таким образом, создается впечатление, что онтология сбивает с толку лежащую в основе структуру, поскольку она содержит воспроизведение сущностей, жестко закодированных в эту структуру.

На это у меня ушло полдня, но, по крайней мере, теперь я знаю, что если кто-то попытается просмотреть иерархию классов онтологии OWL, фреймворк Jena не следует использовать!

person MarkS    schedule 03.11.2015