rdf - 尝试理解 Jena 类层次结构

标签 rdf owl rdfs apache-jena

我正在尝试重现 Protege 中向我显示的 OWL 本体 (owl.ttl) 的类层次结构,您可以在标准 URI 位置 http://www.w3.org/2002/07/owl# 找到它。可供下载。

我正在尝试使用 Jena 的 API 来完成此操作,方法是加载到 OntModel 中,然后获取层次结构根类。然后我想向下递归以构建层次结构。

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

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

当我在 http://www.w3.org/2002/07/owl# 加载 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);

从这里递归,我得到了完整的类层次结构,包括推断的关系,因为我选择了一个合理的模型。

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

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

更新:为了解析本体,即 OWL2 本体,我必须关闭严格模式,因为 Jena 目前与 OWL2 本体不兼容(我使用的是 2.7 版)。 4).

当我使用 OWL_MEM 或 RDFS_MEM 调用 .listHierarchyRootClasses() 时,我返回的根类为零。如果我调用 .listClasses() 并查找没有父类(super class)的所有类来查找根,那么在 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]

同样,这两者都反射(reflect)了我加载到 Protege 时看到的相同层次结构。

我不清楚我在这里做错了什么,可能是因为我正在解析 OWL 本体,而这本身就让 Jena 感到困惑(无论是将其视为 RDFS 本​​体还是 OWL 本体)?

最佳答案

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

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

关于rdf - 尝试理解 Jena 类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33474947/

相关文章:

android - Android 上的 Sesame RDF 存储/查询

SPARQL 将 MAX 应用于聚合值

rdf - DatatypeProperty、ObjectProperty 和 FunctionalProperty 之间有什么区别,我应该在什么时候使用它们?

jena - jena 将 ontModel 写成猫头鹰而不是 rdf

geometry - 两个 COUNT 的百分比

rdf - RDF 数据中的简单版本控制

uml - 将 UML 转换为 OWL 本体

web - 删除查询 SPARQL FUSEKI

rdf - rdf :type 打印多个值

rdf - 如果我有一个注解属性 has 并且每个子 (Y,Z) 都有属性 canDo,那么 Y 怎么能继承所有的 canDo?