Protege:匿名 class 包含所有 class 未参与关系的人

Protege: Anonymous class to subsume all classes not participate in a relation

假设有4个类:abcd。 我们有 a has_relation some b

我可以将 c 定义为:has_relation some ba 归入其子类。

但是如果我想让 cd 作为它的子类呢?

(我知道 not(a has_relation some b) 不是真正的答案,因为 d 没有明确定义为有或没有任何关系)

严格来说,由于开放世界的假设,这是不可能推断出来的。因此,实现这一点的唯一方法是断言 AB 无关。根据您需要的推论,有不同的方法可以实现这一点。在所有情况下,您都需要 2 个关系:第一个关系表明该关系确实存在,第二个关系表明该关系不存在。

选项 1

如果您需要的推论需要应用于个体,那么您可以指定如下:

ObjectProperty: isRelatedByRelationXOption1
    DisjointWith: 
        isNotRelatedByRelationXOption1

ObjectProperty: isNotRelatedByRelationXOption1
    DisjointWith: 
        isRelatedByRelationXOption1

如果您随后指定个体 x1y1 通过这两种关系相关,推理器将指出不一致:

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

当我们定义如下关系时,class 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 Whosebug 问题上的回答。