假设有4个类:a
、b
、c
、d
。 我们有a has_relation some b
.
我可以将c
定义为:has_relation some b
将a
作为其子类。
但是,如果我希望c
将d
作为其子类怎么办。
(我知道not(a has_relation some b)
不是一个真实的答案,因为d
没有明确定义为有任何关系或没有任何关系(
严格来说,由于开放世界的假设,这是不可能推断的。因此,实现这一目标的唯一方法是断言A
与B
无关。根据您需要的推论,有不同的方法可以实现此目的。在所有情况下,您都需要 2 个关系:第一个关系声明该关系确实存在,第二个关系声明该关系不存在。
选项 1
如果您需要的推理需要应用于个人,则可以按如下方式指定它:
ObjectProperty: isRelatedByRelationXOption1
DisjointWith:
isNotRelatedByRelationXOption1
ObjectProperty: isNotRelatedByRelationXOption1
DisjointWith:
isRelatedByRelationXOption1
如果随后指定个体x1
和y1
通过这两种关系相关联,则推理者将指示不一致:
Individual: x1
Facts:
isNotRelatedByRelationXOption1 y1,
isRelatedByRelationXOption1 y1
Individual: y1
这样定义关系的潜在缺点是以下内容不会导致不一致:
Class: A
SubClassOf:
isRelatedByRelationXOption1 some B
Class: B
Class: C
SubClassOf:
A,
isNotRelatedByRelationXOption1 some B
如果希望在这种情况下不一致,则需要使用选项 2。
选项 2
当我们定义如下关系时,类C
将不满足。请注意,也没有必要将关系定义为Disjoint
,除非您仍想同时使用这两种关系来检测个体。
ObjectProperty: isRelatedByRelationXOption2
Domain:
A
ObjectProperty: isNotRelatedByRelationXOption2
Domain:
not (A)
Class: A
SubClassOf:
isRelatedByRelationXOption2 some B
Class: B
Class: C
SubClassOf:
A,
isNotRelatedByRelationXOption2 some B
选项 3
如果您不需要使用 Protege,您可能需要考虑使用 SHACL。请参阅我对这个Stackoverflow问题的回答。