我试图在Protege for the OWL ontology(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
对合理模型或无理模型的调用都会返回零结果。
============================================== < / p>
现在我尝试其他的东西。我知道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:资源?
========================================
更新:要解析本体,即OWL2本体,我不得不设置严格模式,因为此时Jena与OWL2本体不兼容(我&m; m使用版本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本体)?
答案 0 :(得分:2)
listHierarchyRootClasses()在其javadoc中声明它将使用的根是owl:Thing。所以它不等同于你后来使用的方法,而且适用于这个本体。
请注意,您使用的本体是一个非常特殊的本体,因为它是语言本身的一部分。在大多数本体中,使用owl:Thing是正确的策略。
答案 1 :(得分:0)
Ignazio是正确的 - 我尝试使用Jena附带的标准教程类层次结构构建器,您可以在GitHub上找到它:https://github.com/apache/jena/blob/master/jena-core/src-examples/jena/examples/ontology/classHierarchy/ClassHierarchy.java。
这是有效的,如果您正在解析的本体不是OWL本体。因此,似乎本体会混淆底层框架,因为它包含了对框架中硬编码的实体的复制。
这花了我半天的时间来确定 - 但至少我现在知道如果有人试图查看OWL本体的类层次结构,那么不应该使用Jena框架!