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