Reasoner 不检查基数 and/or 限制?

Reasoner does not check cardinalities and/or restrictions?

我尝试创建可能最简单的 ontology,由两个 类(A,B)和两个 类 之间的关系(R)组成。我还想声明 A 的每个个体都必须与其他个体有关系 R

:R rdf:type owl:ObjectProperty ;
   rdfs:domain :A ;
   rdfs:range :B .

:A rdf:type owl:Class ;
   rdfs:subClassOf owl:Thing ,
                   [ rdf:type owl:Restriction ;
                     owl:onProperty :R ;
                     owl:someValuesFrom :B
                   ] ;
   owl:disjointWith :B .

:B rdf:type owl:Class ;
   rdfs:subClassOf owl:Thing .

现在一些人:

:a1 rdf:type :A , owl:NamedIndividual ; :R :b1 .
:a2 rdf:type :A , owl:NamedIndividual .
:b1 rdf:type :B , owl:NamedIndividual .

但是推理者并没有抱怨 a2 没有关系 R。为什么?

(注意:我在 Protégé 中创建了 ontology;我尝试了 FacT++ 和 HermiT 推理器)

您也可以使用等效项。

:A owl:equivalentClass [ rdf:type owl:Restriction ; owl:onProperty:R; owl:someValuesFrom owl:Thing ];

您不需要为 R 编写域约束。等效项会处理它。您仍然必须编写范围约束。

但是推理者并没有抱怨 a2 没有关系 R。为什么?

回答这个问题。你需要了解Open world assumption。语义网是开放世界的假设。有一些研究论文,我在下面的评论中说过,将一些概念或角色作为封闭世界假设。例如,在您的示例中,如果您将 R 作为封闭谓词。你会得到你问的错误。这完全是一个理论想法。

I also want to state that every individual of A must have a relation R with some other individual.

你做对了。当你继续断言

:a1 rdf:type :A , owl:NamedIndividual ; :R :b1 .
:a2 rdf:type :A , owl:NamedIndividual .
:b1 rdf:type :B , owl:NamedIndividual .

推理器会正确地推断出有一些值,我们称它为 X,这样 :a2 :R X 并且 Xrdf:type:B。 OWL推理使用了open world assumption。这意味着如果某事没有明确声明是真还是假,则不会假定它是假或真,而是 未知。例如,您可以正确断言

人类 ⊑ ∃ hasMother.Human

也就是说,每个人类都有一个人类作为母亲。如果我说

丹尼尔·韦伯斯特 ∈人类

我就是这么说的;我没有做出前后矛盾的事情。有些事情是真实的,但我们还不知道。我们知道 DanielWebster 有一位母亲,但我们不知道她是谁。

如果你想关闭这个世界,你可以做一些事情,但结果可能不是你想要的。首先,您可以使 B 成为枚举 class。也就是说,您可以明确列出 B:

的个人

B ≡ {b1}

不过,这实际上不会导致不一致。事实上,推理者会推断,由于 a2 必须与某个 B 相关,而唯一的 B 是 b1,因此 a2 通过 R 与 b1 相关。