我创建了一个包含两个类的本体,第一个是命名Father
的,第二个是一个名为的子类Son
。我想使用 Jena 为班级父亲设置以下条件
有唯一的儿子。
有个儿子。
然后我会为 class 做同样的事情Son
:
有一个父亲。
我的第二个问题是我不知道如何使用 JenaSon
将类的实例与类相关联。Father
我知道可以使用 Protégé 来操作我的课程,但我想探索 Jena。
您尝试做的事情在耶拿并不是很困难,但听起来对 OWL 有一些困惑。给定两个类B和C,如果B是C的子类,则意味着每个是B也是C。所以虽然这是真的
(1) 父子类的子类
既然每个父亲也是别人的儿子,那不是真的
(2) Son subClassOf Father
因为不是每个儿子都是父亲。您描述的限制也没有多大意义。基数限制可用于断言类的每个实例通过某些特定属性与另一个类的某些数量的实例完全相关(或至少,或最多)。因此,您可能会说
(3)Son subClassOf(hasFather正好1个Father)
断言 Son 的每个实例都与 Father 的一个实例相关。你也可以说每个父亲必须至少有一个孩子(我在这里使用孩子,而不是儿子,因为孩子也可以是女儿)
(4) 父子类(hasChild some Child)
但如果你只是为男性建模,我想你可以说
(5) Father subClassOf (hasSon some Son)
或者
(6) 父子类(hasSon min 1 Son)
让我们创建一个包含 Son 和 Father 类以及公理 (1)、(3) 和 (5) 的 OntModel。然后我们将添加一个父亲实例 AbrahamLincoln 和一个儿子实例 RobertToddLincoln,以及它们之间的适当关系:
(7) 罗伯特托德林肯有父亲亚伯拉罕林肯
(8) 亚伯拉罕林肯有儿子罗伯特托德林肯
现在,我们实际上马上就会遇到一个问题:量化基数限制是 OWL2 的一部分,但不是 OWL1 的一部分,而且 Jena 还不支持 OWL2。幸运的是,在这种情况下,我们可以解决这个问题,但是说 Sons 只有作为父亲的 Fathers,而 Sons 只有一个父亲:
(3'a) Son subClassOf (hasFather only 父亲)
(3'b) Son subClassOf (hasFather 正好 1)
你最终得到的代码是:
import com.hp.hpl.jena.ontology.Individual;
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;
public class FatherSonOntology {
public static void main(String[] args) {
final String ns = "http://example.org/";
final OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM );
model.setNsPrefix( "ex", ns );
final OntClass son = model.createClass( ns+"Son" );
final OntClass father = model.createClass( ns+"Father" );
final OntProperty hasFather = model.createObjectProperty( ns+"hasFather" );
final OntProperty hasSon = model.createObjectProperty( ns+"hasSon" );
// (1) Father subClassOf Son
son.addSubClass( father );
// (3'a) Son subClassOf (hasFather only Father)
son.addSubClass( model.createAllValuesFromRestriction( null, hasFather, father ));
// (3'b) Son subClassOf (hasFather exactly 1)
son.addSubClass( model.createCardinalityRestriction( null, hasFather, 1 ));
// (5) Father subClassOf (hasSon min 1 Son)
father.addSubClass( model.createSomeValuesFromRestriction( null, hasSon, son ));
// You can create individuals of a given type using Individual#createIndividual,
// or with Model#createIndividual.
final Individual abe = father.createIndividual( ns+"AbrahamLincoln" );
final Individual rob = model.createIndividual( ns+"RobertToddLincoln", son );
// You can add properties to individuals using Individual#addProperty, or you can
// use the various Model#add methods to add statements to the model.
rob.addProperty( hasFather, abe ); // (7)
model.add( abe, hasSon, rob ); // (8)
model.write( System.out, "RDF/XML-ABBREV" );
}
}
最后打印本体(您可以保存并在 Protégé 中打开以检查所有内容是否按预期显示):
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:ex="http://example.org/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Class rdf:about="http://example.org/Father">
<rdfs:subClassOf>
<owl:Class rdf:about="http://example.org/Son"/>
</rdfs:subClassOf>
</owl:Class>
<owl:ObjectProperty rdf:about="http://example.org/hasSon"/>
<owl:ObjectProperty rdf:about="http://example.org/hasFather"/>
<owl:Restriction>
<rdfs:subClassOf rdf:resource="http://example.org/Son"/>
<owl:allValuesFrom rdf:resource="http://example.org/Father"/>
<owl:onProperty rdf:resource="http://example.org/hasFather"/>
</owl:Restriction>
<owl:Restriction>
<rdfs:subClassOf rdf:resource="http://example.org/Father"/>
<owl:someValuesFrom rdf:resource="http://example.org/Son"/>
<owl:onProperty rdf:resource="http://example.org/hasSon"/>
</owl:Restriction>
<owl:Restriction>
<rdfs:subClassOf rdf:resource="http://example.org/Son"/>
<owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
>1</owl:cardinality>
<owl:onProperty rdf:resource="http://example.org/hasFather"/>
</owl:Restriction>
<ex:Son rdf:about="http://example.org/RobertToddLincoln">
<ex:hasFather>
<ex:Father rdf:about="http://example.org/AbrahamLincoln">
<ex:hasSon rdf:resource="http://example.org/RobertToddLincoln"/>
</ex:Father>
</ex:hasFather>
</ex:Son>
</rdf:RDF>