在 owl 中仅使用约束会导致不一致
Using only constraint in owl leads to inconsistency
我正在尝试模拟以下情况:
- 学位可以是学士或硕士
- 学生可能是学士或硕士
- 一个学位可能有学生:学士学位只有BachelorStudents,反之亦然。
我想尝试使用“only”限制,因此我定义了 Bachelor,例如,等同于“has only BachelorStudent”。
因此,我使用 Protegé 生成了以下代码:
:has rdf:type owl:ObjectProperty ;
rdfs:domain :Degree ;
rdfs:range :Student .
:Bachelor rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Restriction ;
owl:onProperty :has ;
owl:allValuesFrom :BachelorStudent
] ;
rdfs:subClassOf :Degree ;
owl:disjointWith :Master .
:BachelorStudent rdf:type owl:Class ;
rdfs:subClassOf :Student ;
owl:disjointWith :MasterStudent .
:Degree rdf:type owl:Class ;
owl:disjointWith :Student ;
owl:disjointUnionOf ( :Bachelor
:Master
) .
:Master rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Restriction ;
owl:onProperty :has ;
owl:allValuesFrom :MasterStudent
] ;
rdfs:subClassOf :Degree .
:MasterStudent rdf:type owl:Class ;
rdfs:subClassOf :Student .
:Student rdf:type owl:Class ;
owl:disjointUnionOf ( :BachelorStudent
:MasterStudent
) .
但是,当我启动推理器时,这会导致不一致。提供的解释如下:
我不知道我做错了什么。是我误解了“only”的用法,还是有其他错误?
问题如下:公理:
Master EquivalentTo has only MasterStudent
因此,没有 has
属性 的事物被 class 化为 Master(has only MasterStudent
包含没有 has
属性)。如果这听起来很奇怪,请想想 class hasChild only Person
。此 class 识别事物,如果它们有 children,那么 children 就是人。很明显,人属于这个class,即使他们没有children.
Bachelor
也是如此。所以,如果一个东西没有 has
属性,那么它一定同时属于 Bachelor
和 Master
。但是如果存在这样的东西,那么它就违反了Bachelor
和Master
之间的不相交关系。所以我们必须得出结论,所有东西都有has
属性。这意味着一切都是 Degree
(因为 has
的域)并且与 Student
相关(因为 has
的范围)。所以存在学生,并且由于一切都是Degree
,这些学生是学位,这违反了Student
和Degree
之间的不相交。
现在,您的模型的问题在于您使用了等价公理。您应该改为使用 subclass 关系,并添加所有学位必须与至少一些学生具有 has
关系,如下所示:
Master SubClassOf has only MasterStudent
Master SubClassOf has some Student
Bachelor SubClassOf has only BachelorStudent
Bachelor SubClassOf has some Student
甚至,如果您希望它更受约束:
Master EquivalentTo (has only MasterStudent and has some Student)
Bachelor EquivalentTo (has only MasterStudent and has some Student)
我正在尝试模拟以下情况:
- 学位可以是学士或硕士
- 学生可能是学士或硕士
- 一个学位可能有学生:学士学位只有BachelorStudents,反之亦然。
我想尝试使用“only”限制,因此我定义了 Bachelor,例如,等同于“has only BachelorStudent”。 因此,我使用 Protegé 生成了以下代码:
:has rdf:type owl:ObjectProperty ;
rdfs:domain :Degree ;
rdfs:range :Student .
:Bachelor rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Restriction ;
owl:onProperty :has ;
owl:allValuesFrom :BachelorStudent
] ;
rdfs:subClassOf :Degree ;
owl:disjointWith :Master .
:BachelorStudent rdf:type owl:Class ;
rdfs:subClassOf :Student ;
owl:disjointWith :MasterStudent .
:Degree rdf:type owl:Class ;
owl:disjointWith :Student ;
owl:disjointUnionOf ( :Bachelor
:Master
) .
:Master rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Restriction ;
owl:onProperty :has ;
owl:allValuesFrom :MasterStudent
] ;
rdfs:subClassOf :Degree .
:MasterStudent rdf:type owl:Class ;
rdfs:subClassOf :Student .
:Student rdf:type owl:Class ;
owl:disjointUnionOf ( :BachelorStudent
:MasterStudent
) .
但是,当我启动推理器时,这会导致不一致。提供的解释如下:
问题如下:公理:
Master EquivalentTo has only MasterStudent
因此,没有 has
属性 的事物被 class 化为 Master(has only MasterStudent
包含没有 has
属性)。如果这听起来很奇怪,请想想 class hasChild only Person
。此 class 识别事物,如果它们有 children,那么 children 就是人。很明显,人属于这个class,即使他们没有children.
Bachelor
也是如此。所以,如果一个东西没有 has
属性,那么它一定同时属于 Bachelor
和 Master
。但是如果存在这样的东西,那么它就违反了Bachelor
和Master
之间的不相交关系。所以我们必须得出结论,所有东西都有has
属性。这意味着一切都是 Degree
(因为 has
的域)并且与 Student
相关(因为 has
的范围)。所以存在学生,并且由于一切都是Degree
,这些学生是学位,这违反了Student
和Degree
之间的不相交。
现在,您的模型的问题在于您使用了等价公理。您应该改为使用 subclass 关系,并添加所有学位必须与至少一些学生具有 has
关系,如下所示:
Master SubClassOf has only MasterStudent
Master SubClassOf has some Student
Bachelor SubClassOf has only BachelorStudent
Bachelor SubClassOf has some Student
甚至,如果您希望它更受约束:
Master EquivalentTo (has only MasterStudent and has some Student)
Bachelor EquivalentTo (has only MasterStudent and has some Student)