如何在 OWL 中表示关系 'grandfather'?

How to represent relation 'grandfather' in OWL?

1. Alex is Beck's father.
2. Beck is Carl's father.

根据1和2,我们可以推断:

3. Alex is Carl's grandfather.

对于 OWL 实现,我在 Protege 上设置了三个 OWL 类 和一个名为 'isFatherOf' 的对象 属性。作为 Reasoner 推理的结果,我怎样才能得到 3 的结果?

<!-- 
///////////////////////////////////////////////////////////////////////////////////////
//
// Object Properties
//
///////////////////////////////////////////////////////////////////////////////////////
 -->




<!-- http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#isFatherOf -->

<owl:ObjectProperty rdf:about="http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#isFatherOf"/>



<!-- 
///////////////////////////////////////////////////////////////////////////////////////
//
// Classes
//
///////////////////////////////////////////////////////////////////////////////////////
 -->




<!-- http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#Alex -->

<owl:Class rdf:about="http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#Alex">
    <owl:equivalentClass>
        <owl:Restriction>
            <owl:onProperty rdf:resource="http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#isFatherOf"/>
            <owl:someValuesFrom rdf:resource="http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#Beck"/>
        </owl:Restriction>
    </owl:equivalentClass>
</owl:Class>



<!-- http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#Beck -->

<owl:Class rdf:about="http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#Beck">
    <owl:equivalentClass>
        <owl:Restriction>
            <owl:onProperty rdf:resource="http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#isFatherOf"/>
            <owl:someValuesFrom rdf:resource="http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#Carl"/>
        </owl:Restriction>
    </owl:equivalentClass>
</owl:Class>



<!-- http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#Carl -->

<owl:Class rdf:about="http://www.semanticweb.org/administrator/ontologies/2016/0/untitled-ontology-3#Carl"/>

你说的场景很容易用property chains实现,其实这个link已经完全解释了同样的场景。但简而言之,您需要创建 3 个个体(Carl、Alex 和 Beck),然后将 isFatherOf 属性 分配给每个个体。因此:

onto:Alex rdf:type onto:Person ,
               owl:NamedIndividual ;
      onto:isFatherOf onto:Beck .

onto:Beck rdf:type onto:Person ,
               owl:NamedIndividual ;
      onto:isFatherOf onto:Carl .

onto:Carl rdf:type onto:Person ,
               owl:NamedIndividual .

下一件重要的事情是创建一个 属性 isGrandFatherOf 提到这是一个由两个 isFatherOf:

组成的链
onto:isGrandFatherOf rdf:type owl:ObjectProperty ;             
                 owl:propertyChainAxiom ( onto:isFatherOf
                                          onto:isFatherOf) .

现在可以推断:

为了清楚起见,我在这个例子中也添加了 isFatherOf 的逆运算,这样每个阶段的推理器都会告诉你谁是谁的父亲:

onto:hasFather rdf:type owl:ObjectProperty ;
           owl:inverseOf onto:isFatherOf .

但是一定要阅读 link 的内容,解释得很好。