OWL:如何从超类继承两个类之间的属性关系?

Posted

技术标签:

【中文标题】OWL:如何从超类继承两个类之间的属性关系?【英文标题】:OWL: How to get inheritance of property relations between two classes from those of superclasses? 【发布时间】:2016-09-05 14:58:26 【问题描述】:

假设我们有两个名为PeopleDisease 的类。这些类由对象属性has 关联。

:People :has :Disease

People 有子类(或个体)JohnDisease 有子类(或个体)Cancer

:John a :People
:Cancer a :Disease

我们如何通过推理得到这些子类之间的关系?

:John :has :Cancer

【问题讨论】:

你是说你想推断约翰患有癌症,因为约翰是一个人,人有疾病吗?这没有任何意义,因此更清楚地了解您拥有哪些事实以及您想要推断什么可能是一个好主意。 (并且单数名词更适合类名 - 即 :Person 而不是 :People 【参考方案1】:

在您得到答案之前,您需要解决许多误解。

首先,子类和个体是非常不同的概念。个人(实例)是类的成员。子类表示一个类是另一个类的子集,这意味着(通过推理)一个子类的所有成员都是(超)类的成员。 (仅供参考:OWL中没有继承的概念。)

第二类级别的属性,例如:People :has :Disease 对类个人没有意义。定义属性与类的关系的方法是设置属性的域和范围。 (仅使用 :has 作为属性名称表明存在多种误解,可能来自其他类型的语言。)所以我建议使用名称 :hasDisease 和断言:

:hasDisease rdfs:domain :People .
:hasDisease rdfs:range :Disease .

第三,鉴于:Cancer:Disease 的子类,您可以断言:John :hasDisease :Cancer 并推断John 患有疾病。这需要一个标准的 RDFS 推理器。此外,鉴于上述域和范围定义以及断言:Joy :hasDisease :Gout,RDFS 推理器将推断出:Joy a :Person:Gout a :Disease

您可以通过 Google 找到一些 OWL 入门书。我建议仔细阅读其中的一些内容,以基本了解 OWL 和推理配置文件的工作原理。

【讨论】:

感谢您的建议。我读了this primer,不知道我的理解是否正确:入门书说,从技术上讲,类之间的子类关系是传递的。也就是说,假设一个类person具有hasTwoLegs的属性,那么它的子类John也具有相同的属性关系。但是,如果John 是个人,则它不具有hasTwoLegs 属性。为什么?它不应该因为它是person 类的成员而具有该属性吗?我想知道是否有任何方法可以得到这个推断结果。 是的,子类关系是传递的。但是 RDFS 中子类的唯一含义是类成员资格。子类的成员是类的成员。没有其他的。因此属性不是由实例或子类“继承”的。同样,属性通过域和范围与具有上述含义的类相关。没有其他的。这很令人困惑,因为它不使用 OO 原则。将 OWL 类视为一个集合,这可能是一个更好的开始原则。此外,“个体”是类的成员(也称为“实例”)。

以上是关于OWL:如何从超类继承两个类之间的属性关系?的主要内容,如果未能解决你的问题,请参考以下文章

mypy 无法识别从超类继承的变量

Python子类方法从超类方法继承装饰器

子类没有正确地从超类继承结构[重复]

Django,Python继承:从超类中排除一些字段

Django模型继承:使用现有超类创建子类

面向对象之继承