也可以在创建类实例时指定多个额外的关键词参数,如namespace值和各种本体中的类属性值。
创建完成的类实例可以立即访问;类名.instances()方法会返回一个生成器,可以用于遍历或者创建一个包含该类所有实例的列表;实例也包含有.equivalent_to()方法
6. 属于多个类的实例
Owlready2中也支持实例属于多个类的情况,类实例有.is_a属性,此属性和Class.is_a相似。创建属于多个类的实例时,要先创建单类实例,然后通过向.is_a中添加类名来增加它所从属的类。
Owlready2会自动创建一个隐藏的类,这个类继承自Drug以及BloodBasedProdut。这个隐藏类在a_blood_based_drug.__class__中可见,但在a_blood_based_drug.is_a中不可见
7. 销毁实体
destroy_entity()这个全局函数可以被用来销毁一个实体。它将实体从本体以及quad store中移除。Owlreaddy2和Protege4在销毁实体时的处理相似:将实体所有的相关的关系也一并移除,所有相关的类、constructs以及blank nodes也一并移除
属性
1. 创建属性
一个新的属性可以用继承一个ObjectProperty类或者DataProperty类来创建(两个都是Owlready2中的类)。这两个类中的domain和range属性可以用来指定本体中属性的domain和range,这两个类属性为列表类型,因为OWL允许为本体属性指定多个域,但是最终的domain或者range为列表中各元素的交集。
下例在本体中建立了两个类,Drug和Ingredient以及一个关联两者的ObjectProperty属性
也可以用以下的方法创建ObjectProperty,作用同上,其中‘domain >> range’将取代ObjectProperty这个父类
2. 创建一个关系
在本体中,关系是一个三元组(主语、谓语、宾语),其中本体的属性用作谓语,类实例或者文字类型作为主语和宾语,具体谁做主语谁做宾语会在属性的domain和range中定义。
使用主语的Python属性(attribute)可以获取或者创建一个关系,属性(attribute)名称与本体属性类(Property)名称相同
可
以
使
用
instance_1_name.property_name.append(instance_2_name)
或
者
instance_1_name.property_name.remove(instance_2_name)方法来增加或者删除关系的宾语。
3. 数据属性
数据属性是本体中属性的range为特定数据类型的属性,Owlready2目前支持以下数据类型:
? ? ? ? ? ? ? ? ?
int
float bool
str (string)
owlready2.normstr (normalized string, a single-line string) owlready2.locstr (localized string, a string with a language associated) datetime.date datetime.time datetime.datetime
上例创建了一个has_for_synonym的数据属性,它的range为str类型,并且为acetaminophen这一实例创建了has_for_synonym关系;效果相同的数据属性也可以如下图所示创建:
4. 反转属性(Inverse Properties)
Inverse Properties的定义:如果两个属性以相反的方式(domain和range相反)表达同样的意思,则这两个属性互为相反属性。如is_ingredient_of和has_for_ingredient互为相反属性。就像:“a drug A has for ingredient B” 与“B is ingredient of drug A”含义相同。
在Owlready2中定义相反属性需要先定义属性的domain和range然后在属性类的inverse_property的属性(attribute)中指定与它相反的属性名。
Owlready2会自动处理反转属性,如果设置A is_ingredient_of B则会自动设置B has_for_ingredient A。但是这只会在声明反转属性之后生效,例如在先创建A类、B类以及属性has_for_ingredient,再设置A.has_for_ingredient.append(B),最后才创建反转属性is_ingredient_of,则B.is_ingredient_of中不会有A
5. 函数型属性和反转的函数型属性
函数型属性是一种属性值为特定数据类型的属性,继承FunctionalProperty类来创建函数型属性。
反转的函数型属性的反转属性是函数型属性,可以通过继承InverseFunctionalProperty创建。
6. 创建子属性
通过继承已经创建的属性(或类)来创建子属性(或子类)。
Owlready2暂时不支持在子属性被定义后自动更新父属性,如果需要这个功能,使用
get_relations()全局函数。
7. 将Python别称(alias)关联到属性
在本体中属性名一般都很长,例如has_for_ingredient,但是在Python中短的属性名更常见一些,如ingredients。Owlready2允许使用ANNOTATIONS二维列表来为属性名重命名。
注意,此时在属性类里,被声明别名的属性仍然只能使用原名。例如如果要创建has_for_ingredient的子属性,应该是 class sub_prop(has_for_ingredient),写成 class sub_prop(ingredients)无效。