对象属性限制 - jena

时间:2014-05-04 19:58:48

标签: java api jena

如何确定Jena中类的对象属性限制。

我一直试图通过使用类似的东西确定一个类是否有对象限制:

         if (essaClasse.isRestriction()) 
                    {
                        System.out.println( "Restriction on property " + 
                        essaClasse.asRestriction().getOnProperty() );
                    }
         else 
                    {
                        System.out.println( "There is not restriction"  );
                    }

但我得到了:"没有限制"

owl文件有一个类(UserModel),它具有以下限制:

<owl:Class rdf:about="&geosim2;UserModel">
     <rdfs:label xml:lang="en">UserModel</rdfs:label>
     <rdfs:subClassOf rdf:resource="&geosim2;Model"/>
     <rdfs:subClassOf>
         <owl:Restriction>
            <owl:onProperty rdf:resource="&geosim2;hasPeople"/>
            <owl:minCardinality   rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
        </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
        <owl:Restriction>
            <owl:onProperty rdf:resource="&geosim2;hasPhysicalPlace"/>
            <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
        </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:isDefinedBy rdf:datatype="&xsd;string">http://dit.upm.es/~perez/geosim/0.1.3/ns.owl#</rdfs:isDefinedBy>
    <rdfs:comment xml:lang="en">An instance of this class models a user simulation model.</rdfs:comment>
</owl:Class>

1 个答案:

答案 0 :(得分:1)

如果我们看一下OntClass#isRestriction()的实现,我们会发现它需要能够在底层图中找到特定的三元组,以便确定它确实是一个限制。具体来说,它会查找?instance rdf:type ?obj,其中您的个人资料指定了?obj

我们假设你有一个OWL个人资料。然后OWLProfile#RESTRICTION()指定,为了被解释为Restriction,相关资源需要owl:Restriction类型。

您的本体中有对象属于该类型,但您的代码示例不会公开您是否引用它们。如果在您的代码示例中,essaClasse引用了:&geosim2;UserModel,那么您的代码正在完全按照应有的方式执行操作。 &geosim2;UserModel 是限制,但 的是rdfs:subClassOf件事。

<强> TL; DR:

您需要列出感兴趣的类的超类(使用OntClass#listSuperClasses(),然后确定那些是否有限制。这将为您提供类的限制。

在可能无法编译的代码中(写在我的头顶):

final ExtendedIterator<OntClass> superClass = esseClasse.listSuperClasses();
while( superClass.hasNext() ) {
    final OntClass aParent = superClass.next();
    if( aParent.isRestriction() ) {
        // Do interesting things
    }
    else {
        // Do other interesting things
    }
}
相关问题