如何在OWL2/Protege/本体中将属性定义为两个条件的交集
isFriendOf属性(基于请求发送与接受的自动推断) 问题描述
我想要建模的内容如下:
假设属性isFriendOf并非对称关系,要使x isFriendOf y成立,需满足以下两个条件:
x sendsFriendRequestTo y y acceptsFriendRequestFrom x
且当本体中存在这两个属性时,需自动推断出x isFriendOf y,对应的逻辑表达式为:
(x sendsFriendRequestTo y) AND (y acceptsFriendRequestFrom x) -> x isFriendOf y
已尝试的建模方案
我尝试通过以下两种property chain(属性链)方式建模该属性:
- 属性链写法1:
sendsFriendRequestTo some (acceptsFriendRequestFrom Self) -> isFriendOf
推理器报错,日志显示:Non-Simple Obj Property is used a simple one
- 属性链写法2:
sendsFriendRequestTo o acceptsFriendRequestFrom -> isFriendOf
我意识到这并非两个属性的正确组合,因为这个链实际表达的是x sendsFriendRequestTo z且z acceptsFriendRequestFrom y,和我们需要的逻辑不符。
额外说明
我可以将类定义为两个类/概念的交集,但不清楚如何将属性定义为另外两个属性的交集(以及如何指定最终属性的定义域和值域?)。
我了解到'Rolification'(即定义一个类并强制将其作为角色处理),但不确定其工作原理或是否适用于我要建模的场景。
可行的解决方案
其实你提到的Rolification或者OWL 2的属性交集特性,正好能解决这个问题!我来一步步给你讲清楚:
核心思路
我们需要的是两个属性同时成立的逻辑组合(x给y发请求,且y接受了x的请求),而属性链只能表达“属性序列”(x到z,z到y),所以属性链确实不适合这个场景。我们可以通过逆属性+属性交集的方式来实现,或者用Rolification兜底(适合对属性交集支持有限的推理器)。
方法一:逆属性+属性交集(最简单直接)
这是最推荐的方式,只要你的推理器支持OWL 2标准:
定义逆属性:
为acceptsFriendRequestFrom创建逆属性acceptedFriendRequestBy,添加公理:acceptedFriendRequestBy ≡ inverse(acceptsFriendRequestFrom)这个逆属性的意义是:
y acceptsFriendRequestFrom x完全等价于x acceptedFriendRequestBy y,这样我们就可以把双向的属性关系转化为同一方向的两个属性。将
isFriendOf定义为属性交集:
添加公理,让isFriendOf等价于sendsFriendRequestTo和acceptedFriendRequestBy的交集:isFriendOf ≡ ObjectIntersectionOf(sendsFriendRequestTo, acceptedFriendRequestBy)这个公理的意思是:当且仅当x同时满足
sendsFriendRequestTo y和acceptedFriendRequestBy y时,x isFriendOf y成立——正好对应我们需要的两个条件。指定定义域和值域:
直接给isFriendOf添加定义域和值域约束(比如你的个体都是Person类):- 定义域:
isFriendOf Domain Person - 值域:
isFriendOf Range Person
这样推理器就明确知道这个属性只能在Person个体之间生效。
- 定义域:
方法二:Rolification兜底方案(适合旧版推理器)
如果你的推理器对属性交集支持不好,可以用Rolification把属性转化为类,再通过类的交集来实现逻辑:
Rolify基础属性:
- 创建类
SentFriendRequestToSomeone,添加公理:SentFriendRequestToSomeone ≡ sendsFriendRequestTo some Thing(这个类包含所有发送过好友请求的个体) - 创建类
AcceptedFriendRequestFromSomeone,添加公理:AcceptedFriendRequestFromSomeone ≡ acceptsFriendRequestFrom some Thing(这个类包含所有接受过好友请求的个体)
- 创建类
添加通用推导公理:
添加一个OWL通用公理,表达“如果x给y发了请求,且y接受了x的请求,那么x是y的朋友”:Forall x, y: (sendsFriendRequestTo(x,y) ∧ acceptsFriendRequestFrom(y,x)) → isFriendOf(x,y)在本体编辑器中,这个公理可以通过类约束的方式实现:针对任意个体y,属于
ObjectSomeValuesFrom(sendsFriendRequestTo y)且ObjectSomeValuesFrom(inverse(acceptsFriendRequestFrom) y)的个体x,必然属于ObjectSomeValuesFrom(isFriendOf y)。
关于之前的属性链报错
你第一次尝试的属性链报错Non-Simple Obj Property is used a simple one,是因为OWL对属性链中使用的属性有严格要求:必须是简单属性(不能是传递、对称、反身属性,也不能是属性链的结果),而带有Self的属性会被推理器判定为非简单属性,所以触发了错误。
内容的提问来源于stack exchange,提问作者aky

