约束(是一种特殊的本体类)
1. 属性约束
例如,Placebo是一个没有活性成分(Active Principle)的药物
在上例中,has_for_active_principle.some(ActivePrinciple)返回一个至少有一种ActivePrinciple的类。NOT()函数返回一个类的补集,&运算符求两个类的交集。所以这行代码定义了一个Placebo类,并且声明它与Drug类和没有任何ActivePrinciple的类的交集类等价。
Owlready2现在支持以下的约束形式:
? ? ? ? ? ?
some : Property.some(Range_Class) only : Property.only(Range_Class)
min : Property.min(cardinality, Range_Class) max : Property.max(cardinality, Range_Class)
exactly : Property.exactly(cardinality, Range_Class) value : Property.value(Range_Individual / Literal value)
上例说明DrugAssociation是一种有至少两种ActivePrinciple的Drug。
2. 逻辑运算符
Owlready2提供了以下的逻辑运算符,用于类之间的计算:
‘&’ : and operator (intersection). For example: Class1 & Class2
? ‘|’ : or operator (union). For example: Class1 | Class2 ? Not() : not operator (negation or complement). For example: Not(Class1)
?
3. One Of构造器
在本体中,One Of语句被用来通过扩展来定义类,例如通过列举出类的实例而不是定义它的属性来定义类。
4. Inverse-of构造器
Inverse-of构造器返回一个属性的反转,不必新建一个属性
5. 有约束的数据类型
一个被约束的数据类型是一种值被限制的数据,例如整数被限制在0到20。
全局函数ConstrainedDataType()从一个基础数据类型中创建一个约束数据类型,它有如下可选参数:
? ? ? ? ?
length min_length max_length pattern white_space
? ? ? ? ? ?
max_inclusive max_exclusive min_inclusive min_exclusive total_digits fraction_digits
6. 属性链
属性链支持链接两个属性,使用PropertyChain()函数传入一个包含两个要被链接的属性的列表:PropertyChain([prop2, prop2])
不相交、开放以及本地限制的推理(Disjointness, open and local closed world reasoning)
OWL默认世界是开放的,例如所有在本体中生命的东西都被认为不是错的,而是可能的(这种说法一般叫做开放世界假设)。因此如果想要让事物或事实是错的,就一定要在本体中明显地声明出来。
1. 不相交的(disjoint)类
如果没有一个个体同时属于这几个类,那就认为这几个类不相交。
类的不相交性(disjointness)是用AllDisjoint()来创建,它接收一个类的列表作为参数。在下例中,有两个类Drug和ActivePrinciple,我们可以声明他们是不相交的(根据开放世界假设,我们必须显性地将他们不相交的这一事实声明出来)。
3. 不相交的属性
使用AllDisjoint()也可声明不相交的属性
4. 不同的个体
在OWL中,两个个体有可能会被认为是相同的个体,除非他们被显性地声明他俩不同。不同性之于个体就像不相交之于类。下例创建了两个ActivePrinciple实例并且声明他俩不同。
在Owlready2中AllDifferent()函数和AllDisjoint()函数事实上是一样的,不一样的仅仅是
参数。如果传来了类,那它就是AllDisjoint(),如果传来实例那就是AllDifferent()。
5. 查询和修改不相交
.disjoint()方法返回一个生成器(Python里的generator)以遍历某个类、实例、属性的所有不相交的对象。
上例中的.entities属性可以修改,通过修改这个属性就可以增加或删除不相交的对象。 OWL也提供了‘disjointWith’ 和 ‘propertyDisjointWith’关系来设定只涉及两个元素的不相交。Owlready2
6. 关闭个体
开放世界假设同样意味着一个给定个体的属性并不会限制于被声明出来的那些。例如,你创建了一个有单个ActivePrinciple的Drug实例,但并不意味着它只有单个ActivePrinciple。
在上例中,‘my_acetaminophen_drug’是一个有一个ActivePrinciple的药物,但是它可能还有别的ActivePrinciple。
如果你想让‘my_acetaminophen_drug’是一个只有acetaminophen作为ActivePrinciple的药物,你必须显性地声明它。
在约束这一章中,我们知道Property.only(Range_Class)这个函数只接受类域作为参数,所以我们使用OneOf()这一函数来将acetaminophen这个个体转换为类。
你也许已经注意到,开放世界假设这一原则经常会导致乏味的一长列的AllDifference或者其他约束。幸运的是,Owlready2提供了close_world()这一函数以自动地‘关闭’一个实例。close_world()会自动地添加ONLY约束,它接收一个可选参数:一个供‘关闭’的属性列表(传入一个实例则会关闭以该实例为domain的所有属性)。