我不明白owlready2中以下模型的推理:
class Equipment(Thing): pass
class Task(Thing): pass
class EquipmentTask(Task): pass
class task_executed_by_equipment(EquipmentTask >> Equipment, FunctionalProperty): pass
class task_included_subtasks(Task >> Task): pass
class EquipmentTask(Task): equivalent_to = [task_executed_by_equipment.exactly(1, Equipment)]
class MainTask(EquipmentTask): equivalent_to = [task_included_subtasks.only(EquipmentTask)]
task = Task(task_executed_by_equipment=Equipment())
sync_reasoner()
推理机输出显示:
* Owlready * Equivalenting: owl.Thing t.Task
* Owlready * Equivalenting: t.Task owl.Thing
* Owlready * Reparenting t.task1: {t.Task} => {t.EquipmentTask}
* Owlready * Reparenting t.equipment1: {t.Equipment} => {t.Task, t.Equipment}
设备个体不应归类为任务。
如果我将“only”类型更改为“some”,那么它看起来就像我预期的那样。
有人对接下来的推理有提示/想法吗? 还是我的思路哪里出了问题?
提前致谢,帕特里克。
由于 MainTask 也是一个 EquipmentTask,问题在于:
class MainTask(EquipmentTask): equivalent_to = [task_included_subtasks.only(EquipmentTask)]
可以分为以下简单情况:
class a_to_a(A >> A): pass
class A: equivalent_to = [a_to_a.only(A)]
ChatGPT 给了我这个问题的很好的解释:
当您定义 OWL 类 C,然后创建等价类时 使用对象属性 P 进行限制,其中域和 range 被指定为 C,并进一步将其限制为 allValues from C,你本质上是说 C 的每个实例都必须有一个 通过属性 P 与 C 本身的关系。这有效地使得 C 包含一切,因为你说的是 C 的每个实例 通过属性 P 与 C 的所有其他实例相关。 这种行为导致推断 C 相当于最 OWL 中的通用类,即 Thing,因为 Thing 包含 本体中的一切。所以,本质上,你是在这样定义 C 它包含本体中所有实例的方式,使其成为 相当于事物。
我的困惑来自于对 OWL 中“only”(在 Protege、OWLready 等中的称呼)与“allValuesOf”的解释。上述来自 ChatGPT 的回复理由符合“allValuesOf”(“...与所有其他实例相关...”)。 我将“仅”解释为:至少一个且唯一的该类”。