2015-11-02 8 views
1

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

+0

Обновление: теперь я проверил пример иерархии классов, предоставленный исходным кодом Jena. Он отлично работает в онтологии, которая не является онтологией OWL. – MarkS

ответ

1

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

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

+0

Hi Ignazio - благодарю вас за ответ, оцените, что это сложная или специализированная тема. Я могу подтвердить listHierarchyRootClasses() не возвращает owl: Thing при разборе сотовой онтологии - возможно, это потому, что, как вы говорите, это сама онтология OWL. Проблема в том, что это зависимость от всех онтологий OWL - и, скорее, относительно того, что ее довольно сложно разобрать. – MarkS

+1

Нет, регулярные онтологии совы не импортируют эту онтологию - если вы проверяете комментарии внутри, авторы заявляют, что онтологии совы должны/не импортировать их, так как это сделает их совой полной онтологией. Языковые примитивы закодированы непосредственно в вспомогательных инструментах, поэтому обычно они не нужны в явном контенте. – Ignazio

+0

Я обновил свой пост своими выводами после некоторых экспериментов. Оцените комментарий о встроенных словарных сущностях, потенциально запутывающих библиотеку, поэтому я буду тестировать на основе онтологии OWL, которая не является самой онтологией OWL! :) – MarkS

0

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

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

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