添加更复杂的子类公理

我偶然发现了另一个问题……

我想实现与此类似的东西: 在此处输入图像描述

我想使用RDFList这样做,将必要的属性添加到列表中,然后调用方法createUnionClass(或createIntersectionClass)并将它们组合在一起。 然后,将使用addSuperClass()将此方法的结果添加到特定的ontClass中。

这是错的吗? 我从一些非常简单的东西开始,比如:

RDFList rdfList = ontModel.createList(); rdfList.addProperty(ExampleResource1); rdfList.addProperty(ExampleResource2); UnionClass uc = ontModel.createUnionClass(null, rdfList); ExampleClass.addSuperClass(uc); 

但结果不是subClassOf之前所说的两者的联合,而只是subClassOf为零。

任何帮助,将不胜感激。

在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支持将在适当时候添加。

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

不过,您可以使用以下Java代码。 3.是我们希望能够编写的代码,但我们最终不得不使用3a. 代替。 您可以开始挖掘RDF序列化,从而获得真正的合格限制。 我已经展示了如何在相关问题中做到这一点: 如何在JENA中添加合格的基数 。

 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.RDFNode; public class UnionClassExample { public static void main(String[] args) throws FileNotFoundException, IOException { String NS = "https://stackoverflow.com/q/20561994/1281433/"; OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM ); model.setNsPrefix( "so", NS ); OntClass a = model.createClass( NS+"A" ); OntClass b = model.createClass( NS+"B" ); OntClass c = model.createClass( NS+"C" ); OntProperty p = model.createObjectProperty( NS+"p" ); OntProperty q = model.createObjectProperty( NS+"q" ); // 1. B or C OntClass b_or_c = model.createUnionClass( null, model.createList( new RDFNode[] { b, c } )); // 2. p only (B or C) OntClass p_only_b_or_c = model.createAllValuesFromRestriction( null, p, b_or_c ); // 3. q exactly 1 C // OntClass q_exactly_1_C = model.createCardinalityQRestriction( null, q, 1, c ); // 3a. q exactly 1 OntClass q_exactly_1 = model.createCardinalityRestriction( null, q, 1 ); // (2) and (3a) OntClass _2_and_3a = model.createIntersectionClass( null, model.createList( new RDFNode[] { p_only_b_or_c, q_exactly_1 } )); // a subClassOf ((p only (B or C)) and (q exactly 1)) a.addSuperClass( _2_and_3a ); model.write( System.out, "RDF/XML-ABBREV" ); } } 

输出:

                    1          

加入Protégé:

在此处输入图像描述