【问题标题】:Trying to understand Jena class hierarchy试图理解耶拿类层次结构
【发布时间】:2015-11-02 09:58:05
【问题描述】:

我正在尝试重现 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 本体)?

【问题讨论】:

  • 更新:我现在测试了 Jena 源代码提供的类层次结构示例。它适用于不是 OWL 本体的本体。

标签: rdf owl rdfs apache-jena


【解决方案1】:

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

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

【讨论】:

  • 嗨,Ignazio - 感谢您的回复,感谢这是一个棘手或专业的话题。我可以确认 listHierarchyRootClasses() 不返回 owl:Thing 解析 owl 本体时 - 这可能是因为,正如您所说,它是 OWL 本体本身。问题是它是所有 OWL 本体的依赖项——因此相当难以解析。
  • 不,常规的 owl 本体不会导入此本体 - 如果您检查内部的 cmets,作者指出 owl 本体应该/不/导入它,因为这会使它们成为 owl 完整的本体。语言原语直接编码在支持工具中,因此通常它们在显式内容中是不必要的。
  • 经过一些实验后,我用我的发现更新了我的帖子。感谢有关内置词汇实体的评论可能会使库混淆,因此我将使用不是 OWL 本体本身的基于 OWL 的本体进行测试! :)
  • 顺便说一句 - 我会认为 OWL 本体本身是一个 RDFS 本​​体,它定义了 OWL 类(它们都是 rdfs:Class 子类?)。所以实际上我仍然希望 .listHierarchyRootClasses() 在将其作为 RDFS OntModel 加载时工作 - 但你可能仍然是正确的,它可能仍然会使库感到困惑。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2012-09-24
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多