我在本体论中表达以下情况时遇到了麻烦:
假设我有四个人投票和四个投票(因此投票和选民之间存在一对一的映射)。人们可以投票赞成或反对。如果我知道三人投票的结果,我应该能够推断出第四人的投票。
重申:约翰,鲍勃,玛丽和卡罗尔各自投票。由于有四个人有四票。投票结果是一个平局(2是,2没有)。后来推理者确定Bob和John投了反对票。然后推理者应该推断玛丽和卡罗尔投赞成票。
目前我正在使用Jena的java api构建我的本体,并使用Jena推理器进行推理,所以我宁愿使用Jena支持的规则/语义。
答案 0 :(得分:5)
Antoine Zimmerman's answer是正确的,因为这种事情在OWL中是可以表达的,但它需要比你预期的更多的工作,因为你试图强制执行一种closed world reasoning和默认推理,而OWL使open world assumption如果你不知道什么,它不是假定为真或假,只是未知。一旦关闭公理到位,这不是一个难以写的场景。我认为值得一步一步地解决这个问题,看看为了做出推断而需要出现的所有公理,并在OWL DL中做到这一点。你没有提到Protégé,但它是一个非常方便的OWL编辑器,使得编写这些公理变得更加容易。我也将在最后展示最终的OWL(在RDF / XML和Turtle中)。
为了代表一个实例,我宣布一个选民,其中有Alice,Bill,Cindy和Dan作为成员,然后断言这些人是不同的:
现在,为了将每个选民与他们的投票联系起来,我们可以引入带有域名选民的hasVote属性和包含字符串的枚举范围,“是”和“否”。
我们仍然需要与四个选民有关的某事,将他们联系在一起。从概念上讲,这是投票活动,其中唯一的参与者是Alice,Bill,Cindy和Dan,其中每个选民只有一票。让我们介绍一个类VotingEvent和一个对象属性hasVoter,它将VotingEvent与其参与者联系起来。现在,有一些投票活动,我们将为其介绍个人投票活动1。我们断言它的参与者是爱丽丝,比尔,辛迪和丹,只有那些人,而且这次活动的每个选民都只有一票。我们还添加了两个类型约束,即该事件恰好有2个“是”选民。这是足够的,因为只有四个列举的选民,他们是不同的,每个只有一票,每个投票是“是”或“否”,隐含的知识“是”的要求而“不”是不同的字符串,足以确保剩下的两张票必须是“否”票。
现在,如果我们最终断言Alice和Bill投了“是”票,
有足够的理由推断Cindy和Dan投了“否”票,正如我们在Protégé中运行DL查询所看到的那样:
Turtle和RDF / XML序列化都不是特别好看,但我最后都附加了它们,以便于复制和粘贴。现在,这是单个投票活动的合适表示,但请注意,我们引入了一个投票活动,以便 我们添加了对四个选民的限制和他们的选票价值。然而,如果有多个投票事件,并且一些选民参加了多个事件,那么选民只有一票的简单限制是有问题的,因为选民可能在一个事件中投票“是”而在另一个事件中投票“否”。 “Voter 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: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>
答案 1 :(得分:1)
你用OWL本体做到这一点,但它很复杂。首先,你必须模拟一个人只有一票的事实。其次,你必须知道约翰,鲍勃,玛丽和卡罗尔投票。你必须知道有2个“是”,2个“不”。你必须知道鲍勃和约翰投了“不”,他们是两个人,而不是一个化名。你必须知道玛丽和卡罗尔与约翰和鲍勃不同。所以,在Turtle:
:votes a owl:FunctionalProperty .
:John :votes "no" .
:Bob :votes "no";
owl:differentFrom :John .
:Mary a [
owl:onProperty :votes;
owl:minCardinality 1
];
owl:differentFrom :Bob, :John .
:Carol a [
owl:onProperty :votes;
owl:minCardinality 1
];
owl:differentFrom :Bob, :John .
_:someone a [ owl:onProperty :votes; owl:hasValue "no" ];
owl:differentFrom _:someoneelse .
_:someoneelse a [ owl:onProperty :votes; owl:hasValue "no" ] .
_:anotherone a [ owl:onProperty :votes; owl:hasValue "yes" ];
owl:differentFrom _:anotheroneelse .
_:anotheroneelse a [owl:onProperty :votes; owl:hasValue "yes" ] .
[ owl:onProperty :votes; owl:hasValue "no" ]
owl:oneOf ( _:someone _:someoneelse ) .
[ owl:onProperty :votes; owl:hasValue "yes" ]
owl:oneOf ( _:anotherone _:anotheroneelse ) .
这里真正的困难是表达有2个“是”和2个“否”。我已经把它变得紧凑,所以它不是在OWL 2 DL中,但应该可以使它成为OWL 2 DL本体。
请注意,这不允许对多个民意调查或选票进行建模。需要一个更复杂的解决方案(但仍然可行)。