我在本体论中无法表达以下情况:

假设我有四人投票和四票(因此,投票和选民之间是一对一的映射)。人们可以投票赞成或反对。如果我知道三人投票的结果,我应该能够推断出第四人的投票。

重申一下:约翰,鲍勃,玛丽和卡罗尔各投一票。由于有四个人,所以有四票。投票的结果是平局(2是和2否)。后来推理机确定鲍勃和约翰投了反对票。然后,推理机应该能够推断出玛丽和卡罗尔投了赞成票。

目前,我正在使用Jena的Java API构建本体,并使用Jena推理程序进行推理,因此我宁愿使用Jena支持的规则/语义。

最佳答案

Antoine Zimmerman's answer是对的,因为这种事情可以在OWL中表达,但是它需要比您预期的工作更多的工作,因为您正在尝试强制使用closed world reasoning类型和默认推理,而OWL使open world assumption在其中您不知道某些东西,它不被认为是对还是错,只是未知。但是,一旦闭合公理到位,就可以编写一个方案了。我认为有必要逐步解决此问题,以查看进行推理所需的所有公理,并在OWL DL中进行。您没有提到Protégé,但这是一个非常方便的OWL编辑器,使编写这些公理变得更加容易。我还将在最后显示最终的OWL(在RDF / XML和Turtle中)。

仅代表一个实例,我将声明一个选民类,其中有爱丽丝,比尔,辛迪和丹作为成员,然后断言那些人是不同的:



现在,要将每个选民与其投票联系起来,我们可以引入hasVote属性,其域为Voter,枚举范围包含字符串“yes”和“no”。

我们仍然需要与四个选民有关的东西,将它们绑在一起。从概念上讲,这是投票事件,其中唯一的参与者是爱丽丝,比尔,辛迪和丹,每个投票者只有一票。让我们介绍一个类VotingEvent和一个对象属性hasVoter,它将VotingEvent与它的参与者相关联。现在,有一些投票事件,为此我们将介绍一个单独的votingEvent1。我们断言其参与者是爱丽丝,比尔,辛迪和丹,而且只有这些参与者,而且此事件中的每个投票者都只有一票。我们还添加了两个类型约束,它们表示事件恰好有2个"is"选民。这是足够的,因为这样的要求是只有四个枚举的选民,他们必须是不同的,每个选民只有一票,并且每个选票是"is"或“否”,以及隐含的知识是"is"和“否”是不同的字符串,足以确保其余两票必须是“否”票。

现在,如果我们最终断言爱丽丝和比尔投了赞成票,

通过推理在Protégé中运行DL查询可以看出,Cindy和Dan投票支持“否”,这足以说明问题:

Turtle和RDF / XML序列化都不是特别好看,但为了方便复制和粘贴,我将它们附加在最后。现在,这是单个投票事件的合适表示形式,但是请注意,我们引入了一个投票事件,以便在其中添加一些关于四个投票者及其投票值的限制。但是,如果有多个投票事件,并且有些选民参加了一个以上的事件,那么简单的限制是选民只能拥有一票,这是有问题的,因为选民可能会在一个事件中投票"is"而在另一个事件中投票“否”。 “投票x在事件z中对y投票”是一个三级关系,并且如果要出现多个事件,则确实需要这样表示。 W3C工作组说明Defining N-ary Relations on the Semantic Web描述了一些解决方法,但是基本思想是定义一个类,该类的成员代表个人投票,并且与投票事件,投票者和投票有关。您仍然可以为这种推理编写适当的限制,尽管它们会稍微复杂一些,可能涉及属性链或嵌套的类表达式。

龟序列化

@prefix :      <http://example.org/voters#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix voters: <http://example.org/voters#> .

voters:Voter  a  owl:Class .

voters:VotingEvent  a  owl:Class .

voters:hasVote  a    owl:DatatypeProperty ;
        rdfs:domain  voters:Voter ;
        rdfs:range   [ a          rdfs:Datatype ;
                       owl:oneOf  [ a          rdf:List ;
                                    rdf:first  "no" ;
                                    rdf:rest   [ a          rdf:List ;
                                                 rdf:first  "yes" ;
                                                 rdf:rest   ()

                                               ]
                                  ]
                     ] .

voters:Dan  a   owl:NamedIndividual , voters:Voter .

<http://example.org/voters>
        a       owl:Ontology .

voters:Alice  a         owl:NamedIndividual , voters:Voter ;
        voters:hasVote  "yes" .

voters:Bill  a          owl:NamedIndividual , voters:Voter ;
        voters:hasVote  "yes" .

voters:Cindy  a  owl:NamedIndividual , voters:Voter .

voters:hasVoter  a   owl:ObjectProperty ;
        rdfs:domain  voters:VotingEvent ;
        rdfs:range   voters:Voter .

voters:votingEvent1  a   owl:NamedIndividual , voters:VotingEvent ;
        a                [ a                         owl:Restriction ;
                           owl:onClass               [ a               owl:Restriction ;
                                                       owl:hasValue    "yes" ;
                                                       owl:onProperty  voters:hasVote
                                                     ] ;
                           owl:onProperty            voters:hasVoter ;
                           owl:qualifiedCardinality  "2"^^xsd:nonNegativeInteger
                         ] ;
        a                [ a                  owl:Restriction ;
                           owl:allValuesFrom  [ a          owl:Class ;
                                                owl:oneOf  ( voters:Dan voters:Bill voters:Cindy voters:Alice )
                                              ] ;
                           owl:onProperty     voters:hasVoter
                         ] ;
        a                [ a                  owl:Restriction ;
                           owl:allValuesFrom  [ a                         owl:Restriction ;
                                                owl:onDataRange           xsd:string ;
                                                owl:onProperty            voters:hasVote ;
                                                owl:qualifiedCardinality  "1"^^xsd:nonNegativeInteger
                                              ] ;
                           owl:onProperty     voters:hasVoter
                         ] ;
        voters:hasVoter  voters:Alice , voters:Bill , voters:Cindy , voters:Dan .

[ a                    owl:AllDifferent ;
  owl:distinctMembers  ( voters:Alice voters:Bill voters:Cindy voters:Dan )
] .

RDF / XML序列化

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:voters="http://example.org/voters#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Ontology rdf:about="http://example.org/voters"/>
  <owl:Class rdf:about="http://example.org/voters#Voter"/>
  <owl:Class rdf:about="http://example.org/voters#VotingEvent"/>
  <owl:ObjectProperty rdf:about="http://example.org/voters#hasVoter">
    <rdfs:range rdf:resource="http://example.org/voters#Voter"/>
    <rdfs:domain rdf:resource="http://example.org/voters#VotingEvent"/>
  </owl:ObjectProperty>
  <owl:DatatypeProperty rdf:about="http://example.org/voters#hasVote">
    <rdfs:domain rdf:resource="http://example.org/voters#Voter"/>
    <rdfs:range>
      <rdfs:Datatype>
        <owl:oneOf>
          <rdf:List>
            <rdf:first>no</rdf:first>
            <rdf:rest>
              <rdf:List>
                <rdf:first>yes</rdf:first>
                <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
              </rdf:List>
            </rdf:rest>
          </rdf:List>
        </owl:oneOf>
      </rdfs:Datatype>
    </rdfs:range>
  </owl:DatatypeProperty>
  <owl:AllDifferent>
    <owl:distinctMembers rdf:parseType="Collection">
      <owl:NamedIndividual rdf:about="http://example.org/voters#Alice">
        <rdf:type rdf:resource="http://example.org/voters#Voter"/>
        <voters:hasVote>yes</voters:hasVote>
      </owl:NamedIndividual>
      <owl:NamedIndividual rdf:about="http://example.org/voters#Bill">
        <rdf:type rdf:resource="http://example.org/voters#Voter"/>
        <voters:hasVote>yes</voters:hasVote>
      </owl:NamedIndividual>
      <owl:NamedIndividual rdf:about="http://example.org/voters#Cindy">
        <rdf:type rdf:resource="http://example.org/voters#Voter"/>
      </owl:NamedIndividual>
      <owl:NamedIndividual rdf:about="http://example.org/voters#Dan">
        <rdf:type rdf:resource="http://example.org/voters#Voter"/>
      </owl:NamedIndividual>
    </owl:distinctMembers>
  </owl:AllDifferent>
  <owl:NamedIndividual rdf:about="http://example.org/voters#votingEvent1">
    <rdf:type rdf:resource="http://example.org/voters#VotingEvent"/>
    <rdf:type>
      <owl:Restriction>
        <owl:onProperty rdf:resource="http://example.org/voters#hasVoter"/>
        <owl:onClass>
          <owl:Restriction>
            <owl:onProperty rdf:resource="http://example.org/voters#hasVote"/>
            <owl:hasValue>yes</owl:hasValue>
          </owl:Restriction>
        </owl:onClass>
        <owl:qualifiedCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
        >2</owl:qualifiedCardinality>
      </owl:Restriction>
    </rdf:type>
    <rdf:type>
      <owl:Restriction>
        <owl:onProperty rdf:resource="http://example.org/voters#hasVoter"/>
        <owl:allValuesFrom>
          <owl:Class>
            <owl:oneOf rdf:parseType="Collection">
              <owl:NamedIndividual rdf:about="http://example.org/voters#Dan"/>
              <owl:NamedIndividual rdf:about="http://example.org/voters#Bill"/>
              <owl:NamedIndividual rdf:about="http://example.org/voters#Cindy"/>
              <owl:NamedIndividual rdf:about="http://example.org/voters#Alice"/>
            </owl:oneOf>
          </owl:Class>
        </owl:allValuesFrom>
      </owl:Restriction>
    </rdf:type>
    <rdf:type>
      <owl:Restriction>
        <owl:onProperty rdf:resource="http://example.org/voters#hasVoter"/>
        <owl:allValuesFrom>
          <owl:Restriction>
            <owl:onProperty rdf:resource="http://example.org/voters#hasVote"/>
            <owl:qualifiedCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
            >1</owl:qualifiedCardinality>
            <owl:onDataRange rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
          </owl:Restriction>
        </owl:allValuesFrom>
      </owl:Restriction>
    </rdf:type>
    <voters:hasVoter rdf:resource="http://example.org/voters#Alice"/>
    <voters:hasVoter rdf:resource="http://example.org/voters#Bill"/>
    <voters:hasVoter rdf:resource="http://example.org/voters#Cindy"/>
    <voters:hasVoter rdf:resource="http://example.org/voters#Dan"/>
  </owl:NamedIndividual>
</rdf:RDF>

关于jena - 使用Jena的OWL本体谓词逻辑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18560657/

10-13 02:39