Rdf 试图理解Jena类层次结构

Rdf 试图理解Jena类层次结构,rdf,owl,rdfs,apache-jena,Rdf,Owl,Rdfs,Apache Jena,我正在尝试为OWL本体(OWL.ttl)复制Protege中显示给我的类层次结构,您可以在标准URI位置找到它以供下载 我正试图使用Jena的API实现这一点,方法是加载到一个OntModel中,然后获取层次结构根类。然后我想递归下来构建层次结构 我遇到的问题是,当我调用以获取层次结构根类时,返回的结果为零。因此,我没有根类可以从中递归并构建层次结构 =========================================== 当我将OWL本体加载到Protege中时,我得到了一个非常

我正在尝试为OWL本体(OWL.ttl)复制Protege中显示给我的类层次结构,您可以在标准URI位置找到它以供下载

我正试图使用Jena的API实现这一点,方法是加载到一个OntModel中,然后获取层次结构根类。然后我想递归下来构建层次结构

我遇到的问题是,当我调用以获取层次结构根类时,返回的结果为零。因此,我没有根类可以从中递归并构建层次结构

===========================================

当我将OWL本体加载到Protege中时,我得到了一个非常好的类层次结构。然而,当我在Jena中加载到经过推理或未经推理的模型中时,我没有得到这样的层次结构类:

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
从这里开始递归,我得到一个完整的类层次结构,包括推断的关系,因为我选择了一个推理模型

我的问题是,后一种方法是正确的吗?我是否应该让Jena告诉我模型的根级别类是什么,而不是告诉Jena它是rdfs:Resource

========================================

更新:要解析本体,即OWL2本体,我必须关闭strict模式,因为Jena目前与OWL2本体不兼容(我使用的是版本2.7.4)

使用OWL_MEM或RDFS_MEM调用.listHierarchyRootClass()时,返回的根类为零。如果我调用.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本体,而这本身就让Jena感到困惑(无论是将其视为RDFS本体还是OWL本体)?

listHierarchyRootClasses()在其javadoc中声明它将使用的根是OWL:Thing。因此,它并不等同于您稍后使用的方法,也不适用于此本体


请注意,您使用的本体是一个非常特殊的本体,因为它是语言本身的本体建模部分。在大多数本体中,使用owl:Thing是正确的策略。

Ignazio是正确的-我尝试过使用Jena附带的标准教程类层次结构生成器,您可以在GitHub上找到它:

如果您正在解析的本体不是OWL本体,那么这是可行的。因此,本体似乎混淆了底层框架,因为它包含硬编码到框架中的实体的复制


这花了我半天的时间来确定——但至少我现在知道,如果有人试图查看OWL本体的类层次结构,就不应该使用Jena框架

嗨,Ignazio-感谢您的回复,感谢这是一个棘手或专业的话题。我可以确认listHierarchyRootClasses()在解析owl本体时不会返回owl:Thing,这可能是因为,正如您所说,它本身就是owl本体。问题是它是所有OWL本体的一个依赖关系,因此很难解析。不,普通的OWL本体不导入这个本体。如果你检查里面的评论,作者声明OWL本体应该/不应该/导入它,因为这将使它们成为OWL完整的本体。语言原语直接编码在支持工具中,因此在显式内容中通常不需要它们。经过一些实验后,我用我的发现更新了我的帖子。请欣赏有关内置词汇表实体的评论,这些实体可能会混淆库,因此我将使用一个基于OWL的本体进行测试,该本体本身不是OWL本体!:)顺便说一句,我认为OWL本体本身就是一个RDFS本体,它定义了OWL类(都是RDFS:Class子类?)。因此,实际上我仍然希望.listHierarchyRootClasses()在作为RDFS模型加载时能够工作-但是您可能仍然是正确的,它可能仍然会混淆库。更新:我现在已经测试了Jena源代码提供的类层次结构示例。它在不是OWL本体的本体上运行良好。
Class [http://www.w3.org/2002/07/owl#NamedIndividual]
Class [http://www.w3.org/2002/07/owl#Nothing]