2

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

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

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

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

当我将http://www.w3.org/2002/07/owl#上的 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

对合理或不合理模型的调用都返回零结果。

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

现在我尝试别的东西。我知道 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() 并找到所有没有超类的类来查找根,则在 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 本体)?

4

2 回答 2

2

listHierarchyRootClasses() 在其 javadoc 中声明它将使用的根是 owl:Thing。所以它不等同于你后来使用的方法,它适用于这个本体。

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

于 2015-11-02T17:38:25.867 回答
0

Ignazio 是正确的 - 我尝试使用 Jena 附带的标准教程类层次结构构建器,您可以在 GitHub 上找到它:https ://github.com/apache/jena/blob/master/jena-core/src-examples/耶拿/示例/本体/classHierarchy/ClassHierarchy.java

如果您正在解析的本体不是 OWL 本体,则此方法有效。因此,似乎本体混淆了底层框架,因为它包含硬编码到框架中的实体的复制。

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

于 2015-11-03T07:55:56.247 回答