1

如果我有一个包含子属性公理的简单本体:

ex:hasChair rdfs:subPropertyOf ex:hasParticipant .

我想断言“Paul Pill 是示例会议的主席,而 Jack Jill 是示例会议的参与者。” 写得对吗:

:exampleConference a ex:AcademicConference ;
                   ex:hasChair :paul_pill ;
                   ex:hasParticipant :jack_jill .

还是我还需要明确指定 Paul Pill 是参与者(即使 hasChair 是 hasParticipant 的子属性)?也就是说,我需要写:

:exampleConference a ex:AcademicConference ;
                   ex:hasChair :paul_pill ;
                   ex:hasParticipant :paul_pill, :jack_jill .
4

1 回答 1

4

这在很大程度上取决于您在尝试从本体中检索数据时是否有推理器。这么说

hasChair ⊑ hasParticipant

等价于一阶公式:

∀x,y.(hasChair(x,y) → hasParticipant(x,y))

这意味着它从逻辑上遵循 hasChair(exampleConference,paulPill) 和 hasParticipant(exampleConference,paulPill)。但是,如果您只断言 hasChair 语句,您将需要一个 OWL(或 RDFS)推理器来为您证明这一点。如果您同时断言 hasChair 和 hasParticipant 语句,那么您不需要推理器来找出 hasParticipant(exampleConference,paulPill)。

最近在 Jena 用户的邮件列表上提出了一个关于逆属性的类似问题。

如果 a 有一个功能/反功能对,我应该在两个方向上 createStatement,还是应该使用某种推理设备来填写?我在这里创建了很多三元组,所以我倾向于自己制作它们,因为担心大型模型的遍历非常缓慢。

也就是说,如果你有一个属性参与,并且它是 hasParticipant 的逆,问题是它是否足以断言

hasParticipant(exampleConference,paulPill)

或者你是否应该两者都做

hasParticipant(exampleConference ,paulPill)
参与(paulPill,exampleConference)

答案大致相同:如果你有一个推理器,那么一个就足够了。如果你不这样做,那么你可能想要两者。

于 2014-07-17T11:22:02.217 回答