我试图详细了解本体的rector-normalization-technique。我使用owlready来实现示例。
文章建议有一个断言的单继承结构,并通过推理引入多继承。例如,它使用的类为Protein
,Insulin
和Protein_Hormone
, Hormone_Role
。
断言的事实:
Insulin
is_subclass_of
Protein
Insulin
plays_role
Hormone_Role
Protein_Hormone
相当于 (Protein
and
plays_role
owl:someValuesFrom
Hormone_Role
) (定义的类)
在推理器运行后,Insulin
被正确识别为Protein_Hormone
(预期结果)的子类。
然而,它仍然被归类为蛋白质的直接亚类。我认为这种关系是多余的,因为根据定义,每个实例都Protein_Hormone
必须是 a Protein
。另外,如果我应用 Protegé,推断的类结构不包含这种冗余关系,如下所示:
有没有一种(规范的)方法来摆脱这种多余的子类关系?
或者,为什么我对多余的怀疑是错误的?
此问题的代码(另请参阅此笔记本的输出):
import owlready2 as owl2
# rme: rector-modularization-example
onto = owl2.get_ontology("https://w3id.org/yet/undefined/rme#")
with onto:
class Protein(owl2.Thing):
pass
class Insulin(Protein):
pass
class Hormone_Role(owl2.Thing):
pass
class plays_role(owl2.ObjectProperty):
pass
class Protein_Hormone(owl2.Thing):
equivalent_to = [Protein & plays_role.some(Hormone_Role)]
Insulin.is_a.append(plays_role.some(Hormone_Role))
# before reasoning
print(list(Protein.subclasses()))
owl2.sync_reasoner_hermit(infer_property_values=True, debug=1)
# after reasoning
print(list(Protein.subclasses()))