假设有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
定义这样的关系的潜在缺点是,以下将not导致不一致:
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。请参阅我对this Stackoverflow问题的回答。