我正在尝试重现 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/