如何在OWLReady2中定义规则实现depicted_with属性的推理生成?
使用OWLReady2实现人物同框推理
问题说明
基于OWLReady2构建知识图谱,定义Person和Photo类,通过照片描绘人物的事实,自动推理出共同出现在同一张照片中的人物关系(即depicted_with属性)。
修正后的实现代码
from owlready2 import * # 创建本体 onto = get_ontology("urn:test") with onto: # 定义核心类 class Person(Thing): pass class Photo(Thing): pass # 定义属性:照片描绘人物 class depicts(Photo >> Person): pass # 定义反向属性:人物被某照片描绘 class depiction(Person >> Photo): inverse_property = depicts # 定义同框属性:人物与另一人物同框 class depicted_with(Person >> Person): symmetric_property = True # 同框关系是对称的:a和b同框则b和a同框 # 定义推理规则:如果a出现在照片p,且p描绘了b,且a≠b,则a和b同框 depicted_with_imp = Imp() depicted_with_imp.set_as_rule("depiction(?a, ?p), depicts(?p, ?b), differentFrom(?a, ?b) -> depicted_with(?a, ?b)") # 创建实例 pe1 = Person(name="Person 1") pe2 = Person(name="Person 2") pe3 = Person(name="Person 3") ph1 = Photo() ph2 = Photo() # 给照片添加描绘的人物 ph1.depicts = [pe1, pe2] ph2.depicts = [pe2, pe3] # 调用Pellet推理机,开启属性值推理 sync_reasoner_pellet(infer_property_values=True, infer_data_property_values=True) # 验证推理结果 assert pe1.depicted_with == [pe2] assert sorted(pe2.depicted_with, key=lambda x: x.name) == [pe1, pe3] assert pe3.depicted_with == [pe2]
关键调整说明
- 对称属性设置:给
depicted_with添加symmetric_property = True,无需额外编写反向规则,推理机自动处理双向同框关系。 - 规则优化:
- 移除冗余的
Person(?a)判断:因为depiction是Person到Photo的属性,?a必然属于Person类。 - 添加
differentFrom(?a, ?b)条件,避免推理出人物与自身同框的无效关系。
- 移除冗余的
- 推理配置:使用
sync_reasoner_pellet并开启infer_property_values=True,确保推理机自动计算并填充depicted_with的属性值。
内容的提问来源于stack exchange,提问作者user3035850
相关产品推荐
相关产品推荐

