- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法在我的 Ontology 中表达以下情况:
假设我有四个人投票,投了四票(所以 vote 和 voter 之间存在一对一的映射)。人们可以投票赞成或反对。如果我知道三个人的投票结果,我应该能够推断出第四个人的投票。
所以重申一下:约翰、鲍勃、玛丽和卡罗尔各投一票。因为有四个人,所以有四票。投票结果是平局(2 票赞成,2 票反对)。后来推理机确定 Bob 和 John 投了反对票。然后推理者应该能够推断出玛丽和卡罗尔投了赞成票。
目前我正在使用 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 中)。
为了仅表示一个实例,我将声明一个 Voters 类,其中成员有 Alice、Bill、Cindy 和 Dan,然后断言这些个体是不同的:
现在,为了将每个选民与他们的投票相关联,我们可以引入一个具有域选民的 hasVote 属性和包含字符串"is"和“否”的枚举范围。
我们仍然需要一些与四个选民相关的东西,将他们联系在一起。从概念上讲,这是一个投票事件,其中唯一的参与者是 Alice、Bill、Cindy 和 Dan,并且每个选民只有一票。让我们介绍一个类 VotingEvent 和一个将 VotingEvent 与其参与者相关联的对象属性 hasVoter。现在,有一些投票事件,我们将为此引入一个单独的 votingEvent1。我们将断言它的参与者是 Alice、Bill、Cindy 和 Dan,并且只有这些参与者,并且此事件中的每个选民都只有一票。我们还添加了两个类型约束,表示该事件恰好有 2 个“赞成”的投票者。这已经足够了,因为要求只有四个被枚举的选民,他们是不同的,每个人只有一票,并且每张票要么是"is"要么是“否”,并且隐含的知识是"is"和“否”是不同的字符串,足以保证剩下的两票一定是“否”票。
现在,如果我们最终断言 Alice 和 Bill 投了“赞成”票,
有足够的理由推断 Cindy 和 Dan 投了“反对”票,正如我们在 Protégé 中运行 DL 查询所看到的:
无论是 Turtle 还是 RDF/XML 序列化都不是特别好看,但我将它们附在最后,以便于复制和粘贴。现在,这是一个适合单个投票事件的表示,但请注意,我们引入了一个投票事件,以便有一些东西,我们在其中添加了关于四个选民及其投票值(value)的限制。然而,如果有多个投票事件,并且一些选民参加了不止一个事件,那么选民只有一票的简单限制是有问题的,因为选民可能在一个事件中投"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: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 - OWL Ontology Predicate Logic with Jena,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560657/
以下各项之间是否存在明显的性能差异: something.Where(predicate).FirstOrDefault(); 和 something.FirstOrDefault(predicate
讨论来自 this answer让我好奇。哪个更快: someEnumerable.Single(predicate); 或 someEnumerable.Where(predicate).Singl
我知道这个问题是asked a lot by people甚至有人说 So, first(FirstOrDefault(predicate)) one is better in terms of pe
我一直在编写我的 LINQ 查询时使用 Where 子句中的谓词,后跟 FirstOrDefault 子句。我开始在 FirstOrDefault 子句中看到带有谓词的示例。 这个比那个好吗? EF
据我所知,在 Java 8 中引入谓词之前,Guava 中的谓词是为了填补 Java 中的空白而创建的。现在当 Java 中有这样的功能时,使用 Guava 谓词是否仍然有意义?这有什么附加值吗? 最
在 Java 中是否有某种标准方法来表达一个操作来测试一个 Predicate 是否比另一个 Predicate 更严格? 我可以想象类似 pred1.isStricterThan(pred2) 的东
在 Guava 中,Predicates 类有一种名为“or”或“and”的实用方法,您可以传递一个可迭代的或两个谓词。 我有一个如下代码示例: class AccountNamePredicate
检查 IEnumerable 集合是否多于或少于 X 个满足谓词的元素的最佳方法是什么? 我目前正在使用 .Count(lambda) limit。但是,如果您的列表是 ICollection,则
我正在做一些性能测试并注意到像这样的 LINQ 表达式 result = list.First(f => f.Id == i).Property 比慢 result = list.Where(f =>
标题说明了一切。如果我有一个字段 private Predicate myPredicate; 为什么我不能分配一个 Predicate 那个领域的实例? 最佳答案 因为 Predicate 实现逆
我没有找到恒等式 Predicate我预计在 com.google.common.base.Predicates所以我把它搞砸了。我发现它对于单元测试中关于集合的精确行为的断言很有用(例如 Multi
简介 今天在测试某些 LinQ 函数的性能差异时,我注意到 LastOrDefault(predicate) 几乎总是比 FirstOrDefault(predicate) 快,这让我有点吃惊感兴趣,
这是我的代码。 import java.util.stream.Stream; import java.util.List; import java.util.ArrayList; import ja
我有课SomeObject其中有一个功能Evaluate()返回一个 bool 值。如果我有一个 IList像这样: IList parameters; parameters.Add( objA );
我必须执行and()在我的实现 Predicate 的业务对象上. 出现问题的代码是 and() 行调用: Predicate predicate = new M
我有一个核心数据数据库,我正在尝试使用 block 谓词创建获取请求,但我收到未知谓词错误: NOTE: employeeToHouse is a property of type House tha
请帮助这个 Linq 新手! 我正在我的测试类中创建一个列表,我想使用 Moq 来检查结果。 我可以很容易地组合一个谓词来检查列表的结果。然后如何将该谓词变成表达式? var myList = new
Expression> predicate = null; var query2 = query.Join(partJoinTableRepository.GetPartJoinQuery(),
我正在尝试与流 api 一起使用的预定义身份过滤器。不幸的是,我无法正确返回符合 stream api documentation 的通用谓词。 . 根据这里的反编译器是 Stream::filter
你如何解释归纳谓词?它们是做什么用的?他们背后的理论是什么?它们仅存在于依赖类型系统中,还是也存在于其他系统中?它们在某种程度上与 GADT 相关吗?为什么它们在 Coq 中默认为 true? 这是
我是一名优秀的程序员,十分优秀!