Protege的Rules标签中SWRL规则推理匿名类不生效问题咨询
问题根因
不是Protege本身不支持匿名类推理,核心原因是主流OWL推理机对SWRL规则头使用匿名OWL限制类作为断言目标的支持度极低:
- SWRL规则体中使用匿名类属于类成员检测,是OWL推理的基础能力,推理机只需判断个体是否匹配类表达式即可,因此你写的反向规则可以正常运行
- SWRL规则头中使用匿名类属于非命名类断言导出,大多数推理机(Pellet、HermiT、OnTop等)默认不会主动为个体生成并显式添加匿名类的类型断言,因此你看不到规则生效的结果
可行解决方案
- 方法1:修改SWRL规则适配推理机逻辑
先将你需要的匿名类定义为命名类:创建一个命名类SceneWithoutRain,设置等价公理为has_weather exactly 0 Rain,再调整规则为:
规则触发后个体将会被归类到has_weather(?x, ?noRain), NoRain(?noRain), Scene(?x) -> SceneWithoutRain(?x)SceneWithoutRain类下,完全满足你所需的推理逻辑。 - 方法2:替换为纯OWL公理(更推荐)
你当前的需求完全可以通过原生OWL子类公理实现,不需要依赖SWRL,兼容性和推理效率更高:
为Scene类添加子类公理:(has_weather some NoRain) SubClassOf (has_weather exactly 0 Rain)
由于你已经定义了Rain和NoRain为不相交类,推理机运行后会自动推导所有关联了NoRain个体的Scene实例,满足has_weather exactly 0 Rain的类表达式。
内容的提问来源于stack exchange,提问作者Stefani Guneshka
相关产品推荐
相关产品推荐

