あなたがやろうとしていることは Jena ではそれほど難しいことではありませんが、OWL については混乱しているように思えます。2 つのクラスBとCが与えられ、BがCのサブクラスである場合、すべてのBもCであることを意味します。だからそれは本当ですが
(1) 父のサブクラスの息子
すべての父親は他人の息子でもあるので、それは真実ではありません
(2) Son subClassOf 父
すべての息子が父親でもあるわけではないからです。あなたが説明した制限もあまり意味がありません。カーディナリティ制限を使用して、クラスの各インスタンスが、特定のプロパティによって別のクラスのインスタンスの数と正確に (または少なくとも、または最大で) 関連していると断言できます。したがって、おそらく次のように言うでしょう。
(3) Son subClassOf (hasFather ちょうど 1 人の父)
Son の各インスタンスは、Father の 1 つのインスタンスに正確に関連していると主張します。また、各父には少なくとも 1 人の子が必要であると言うことができます (ここでは、子が娘になる可能性があるため、Son ではなく Child を使用します)。
(4) Father subClassOf (hasChild some Child)
男性のみをモデル化している場合は、次のように言えます。
(5) Father subClassOf (hasSon some Son)
また
(6) Father subClassOf (hasSon min 1 Son)
クラス Son と Father と公理 (1)、(3)、(5) を含む OntModel を作成しましょう。次に、Father のインスタンス、AbrahamLincoln、Son のインスタンス、RobertToddLincoln、およびそれらの間の適切な関係を追加します。
(7) RobertToddLincoln hasFather AbrahamLincoln
(8) AbrahamLincoln hasSon RobertToddLincoln
ここで、すぐに 1 つの問題に直面します。数値化されたカーディナリティ制限は OWL2 の一部ですが、OWL1 の一部ではなく、Jena はまだ OWL2 をサポートしていません。幸いなことに、この場合、これを回避できますが、Sons には父としての父しかなく、Sons には父が 1 人だけいると言います。
(3'a) Son subClassOf (hasFather only Father)
(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>