如何在JENA中添加合格的基数

如何在Jena中添加合格的基数限制? 我不能使用createCardinalityQRestriction因为OntModelSpec是第一个版本的OWL,而不是OWL2。 在ModelFactory的createOntologyModel中,有没有办法创建OWL2本体? 我需要一个类表达式

JeVysledkom 正好 1 Kolik_Fazovy

我试过使用这段代码:

 OntModel ontModel = ModelFactory.createOntologyModel(); OntClass ret = ontModel.createCardinalityQRestriction(null, ontProperty, cardinality, ontClass2 ); ontClass.addSuperClass(ret); 

但我得到这个例外:

com.hp.hpl.jena.ontology.ProfileException:尝试使用当前语言配置文件不支持的语言构造CARDINALITY_Q:OWL Full

我实际上只是遇到了另一个问题, 添加更复杂的子类公理 。 在Jena中创建这个有点棘手,因为支持合格的基数限制是一个OWL2function,而Jena对OWL2的支持有限:

Jena Ontology API

请注意,目前,Jena本体API仅对OWL2的合格基数限制(即cardinalityQ,minCardinalityQ和maxCardinalityQ)提供有限的支持。 合格的基数限制封装在接口CardinalityQRestriction,MinCardinalityQRestriction和CardinalityQRestriction中。 OntModel还提供了创建和访问合格基数限制的方法。 由于它们不是OWL 1.0语言定义的一部分,因此OWL本体不支持合格的基数限制。 OWL 2更新中添加了合格的基数限制。 Jena的OWL2支持将在适当时候添加。

另外, OWL2词汇表的Javadoc说:

OWL2词汇。 注意:Jena不提供OWL2推理或OntModel支持。 提供这些常量是为了方便那些正在使用当前OWL1支持并且需要一组合适名称的OWL2工作的用户。

您可能还会看到我在Jena邮件列表中发布的关于类似问题的回复 , Re:Owl maxCardinality限制 。

但是你想创建一个呢? 那么你就是那些正在使用当前OWL1支持并且需要一组合适名称的OWL2工作的用户之一。为了找出如何在RDF中序列化OWL2结构,我们需要看看OWL 2 Web本体语言映射到RDF图(第二版) ,特别是第2节从结构规范映射到RDF图 ,它告诉我们类表达式

 ObjectExactCardinality( n OPE CE ) 

被序列化为以下三元组

 _:x rdf:type owl:Restriction . _:x owl:onProperty T(OPE) . _:x owl:qualifiedCardinality "n"^^xsd:nonNegativeInteger . _:x owl:onClass T(CE) . 

其中_:x是该类的资源。 耶拿已经处理过的不合格案件正在转变

 ObjectExactCardinality( n OPE ) 

 _:x rdf:type owl:Restriction . _:x owl:onProperty T(OPE) . _:x owl:cardinality "n"^^xsd:nonNegativeInteger . 

如果我们有后者之一,我们可以用owl:qualifiedCardinality属性替换它的owl:cardinality属性,并添加相应的owl:onClass属性。 这里有一些Java代码可以做到这一点:

 import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.ontology.OntProperty; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.vocabulary.OWL; import com.hp.hpl.jena.vocabulary.OWL2; public class QualifiedRestrictionExample { public static OntClass createCardinalityQRestriction( OntModel model, String uri, Property prop, int cardinality, OntClass clas ) { OntClass klass = model.createCardinalityRestriction( uri, prop, cardinality ); klass.removeAll( OWL.cardinality ); klass.addLiteral( OWL2.qualifiedCardinality, cardinality ); klass.addProperty( OWL2.onClass, clas ); return klass; } public static void main(String[] args) { String NS = "https://stackoverflow.com/q/20562107/1281433/"; OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM ); OntClass test = model.createClass( NS+"Test" ); OntProperty j = model.createObjectProperty( NS+"JeVysledkom" ); OntClass k = model.createClass( NS+"Kolik_Fazovy" ); OntClass x = createCardinalityQRestriction(model, null, j, 1, k); test.addSuperClass( x ); model.write( System.out, "RDF/XML-ABBREV" ); } } 

输出:

       1        

在Protégé:

Protege中的子类公理

  private void createOneToMany(OntModel ontoModel, OntClass ontoClass, OntProperty prop, Resource resource) { OntClass allValuesFromRestriction = ontoModel.createAllValuesFromRestriction(null, prop, resource); ontoClass.addSuperClass(allValuesFromRestriction); OntClass minCardinalityRestriction = ontoModel.createMinCardinalityRestriction(null, prop, 1); ontoClass.addSuperClass(minCardinalityRestriction); } private void createZeroToMany(OntModel ontoModel, OntClass ontoClass, OntProperty prop, Resource resource) { OntClass allValuesFromRestriction = ontoModel.createAllValuesFromRestriction(null, prop, resource); ontoClass.addSuperClass(allValuesFromRestriction); OntClass minCardinalityRestriction = ontoModel.createMinCardinalityRestriction(null, prop, 0); ontoClass.addSuperClass(minCardinalityRestriction); } private void createZeroToOne(OntModel ontoModel, OntClass ontoClass1, OntProperty prop, OntClass ontoClass2) { OntClass minCardinalityRestriction = ontoModel.createMinCardinalityRestriction(null, prop, 0); ontoClass1.addSuperClass(minCardinalityRestriction); OntClass maxCardinalityRestriction = ontoModel.createMaxCardinalityRestriction(null, prop, 1); ontoClass1.addSuperClass(maxCardinalityRestriction); } private void createOneToOne(OntModel ontoModel, OntClass ontoClass1, OntProperty prop, OntClass ontoClass2) { OntClass minCardinalityRestriction = ontoModel.createMinCardinalityRestriction(null, prop, 1); ontoClass1.addSuperClass(minCardinalityRestriction); OntClass maxCardinalityRestriction = ontoModel.createMaxCardinalityRestriction(null, prop, 1); ontoClass1.addSuperClass(maxCardinalityRestriction); } 

然后你可以这样做:

 OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); OntClass task = ontModel.createClass(OWL.NS + "Task"); OntClass actor = ontModel.createClass(OWL.NS + "Actor"); OntProperty propTask = ontModel.createObjectProperty( OWL.NS + "Task-performedBy-Actor"); OntProperty propActor = ontModel.createObjectProperty( OWL.NS + "Actor-performs-Task"); 

致电:

  createOneToMany(ontModel, task, prop, actor); createZeroToMany(ontModel, task, prop, actor); createOneToOne(ontModel, task, propTask, actor); createZeroToOne(ontModel, actor, propActor, task); 

结果样本:

     1          1        

现在还有ONT-API ,它是OWL2的Jena扩展:

  String ns = "https://stackoverflow.com/q/20562107/1281433/"; OntGraphModel model = OntModelFactory.createModel() .setNsPrefixes(OntModelFactory.STANDARD) .setNsPrefix("test", ns); OntClass c = model.createOntEntity(OntClass.class, ns + "Kolik_Fazovy"); OntNOP p = model.createOntEntity(OntNOP.class, ns + "JeVysledkom"); model.createOntEntity(OntClass.class, ns + "Test") .addSubClassOf(model.createObjectCardinality(p, 1, c)); model.write(System.out, "ttl"); 
    Interesting Posts