试图了解Jena类层次结构

时间:2015-11-02 09:58:05

标签: rdf owl rdfs apache-jena

我试图在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本体)?

2 个答案:

答案 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框架!