如何确定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>
答案 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
}
}