3

我试图详细了解本体的rector-normalization-technique。我使用owlready来实现示例。

文章建议有一个断言的单继承结构,并通过推理引入多继承。例如,它使用的类为Protein,InsulinProtein_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()))
4

0 回答 0