我创建了一个包含两个类的本体,第一个类名为Father,第二个类是名为Son的子类。我想为使用杰娜的班级父亲设置以下条件


  有独子。有儿子


然后,我将对类Son执行相同的操作:


  恰好有一个父亲。


我的第二个问题是,我不知道如何同时使用耶拿(Jena)将类Son的实例与类Father关联。我知道可以使用Protégé操作我的课程,但是我想探索Jena。

最佳答案

在Jena中,您要尝试做的事情并不是很困难,但是听起来好像对OWL有一些困惑。给定两个类别B和C,如果B是C的子类,则意味着每个B也是C。因此,确实


  (1)父子类


既然每个父亲也是别人的儿子,那不是真的


  (2)父子类


因为不是每个儿子都是父亲。您所描述的限制也没有多大意义。基数限制可以用来断言某个类的每个实例都通过某个特定属性与另一个类的某些实例完全(或至少或最多)相关。因此,您可能会说


  (3)儿子subClassOf(父亲完全是1个父亲)


断言儿子的每个实例都与父亲的一个实例完全相关。您还可以说,每个父亲必须至少有一个孩子(由于孩子也可以是女儿,我将在这里使用“孩子”而不是“儿子”)


  (4)父亲subClassOf(有孩子一些孩子)


但是如果你只是在模仿男性,我想你可以说


  (5)父亲subClassOf(有一个儿子)


要么


  (6)父亲subClassOf(拥有儿子1分)


让我们创建一个包含类Son和Father以及公理(1),(3)和(5)的OntModel。然后,我们将添加父亲的一个实例AbrahamLincoln和儿子的一个实例RobertToddLincoln,以及它们之间的适当关系:


  (7)罗伯特·托德·林肯有父亲亚伯拉罕·林肯
  (8)亚伯拉罕·林肯有儿子罗伯特·托德·林肯


现在,我们实际上将立即遇到一个问题:量化基数限制是OWL2的一部分,但不是OWL1的一部分,并且Jena尚不支持OWL2。幸运的是,在这种情况下,我们可以解决此问题,但要说儿子只有父亲作为父亲,而儿子恰好有一个父亲:


  (3'a)儿子subClassOf(只有父亲父亲)
  (3'b)儿子subClassOf(父亲精确为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>

10-06 16:13