如何在Protégé中使用SWRL表达存在量词“there exist”
问题诊断
你原来的写法确实不符合需求:前件中声明的Entity(?e)会要求规则必须匹配到本体中已有的实体才能触发,相当于把所有现存实体都强行绑定给满足通信关系的活动对,既没有实现“存在新实体”的语义,还会引入大量错误的关系断言。
另外需要注意,标准SWRL规范不允许后件中出现未在前件完成绑定的变量,因此不能直接通过常规SWRL规则表达后件的存在量词语义。
可行实现方案
方案1:通过OWL存在限制公理实现(无需编写SWRL规则)
你可以直接用OWL的类限制公理表达对应的逻辑,完全不需要自定义规则:
定义针对活动的子类限制:
SubClassOf( Activity and (wasCommunicatedBy some Activity) used some (Entity and wasGeneratedBy some (inverse wasCommunicatedBy)) )
该公理的含义就是:如果一个活动通过wasCommunicatedBy关联到另一个活动,那么它一定使用了某个由关联活动生成的实体,完全匹配你的需求。
方案2:使用支持新实例创建的SWRL扩展
如果你的推理环境(比如Protege搭配Pellet/HERMIT推理器,并安装了SWRL实例创建扩展)支持非标准的SWRL扩展,你可以直接把变量?e移到后件,推理器会自动为符合条件的活动对实例化新的实体:wasCommunicatedBy(?a2, ?a1) -> Entity(?e) ^ wasGeneratedBy(?e, ?a1) ^ used(?a2, ?e)
注意该写法仅适配支持SWRL新实例创建扩展的推理引擎,不符合标准SWRL规范。
方案3:适配标准SWRL的折中实现
如果只能使用标准SWRL,可以拆分逻辑实现:
- 先为每对存在通信关系的活动手动创建对应的中间实体,添加断言
CommunicationIntermediate(?e) ^ relatedToSender(?e, ?a1) ^ relatedToReceiver(?e, ?a2) - 编写符合SWRL规范的规则,所有变量都在前件完成绑定:
wasCommunicatedBy(?a2, ?a1) ^ CommunicationIntermediate(?e) ^ relatedToSender(?e, ?a1) ^ relatedToReceiver(?e, ?a2) -> wasGeneratedBy(?e, ?a1) ^ used(?a2, ?e)
该写法兼容所有支持标准SWRL的推理引擎。
内容的提问来源于stack exchange,提问作者user93804

