OWL2 有量化限制,这意味着你可以拥有形式为
的类表达式
∃p.C
表示具有C类型的属性p值的个体类别。同样,您可以使用限制
∀p.D
这是一个个体类别,其所有属性p的值(虽然可能没有)都是D类型。还有数字限制,因此您可以指定值的最小数目、值的最大数目或值的确切数目。
≤n p.C
≥n p.C
=n p.C
您还可以使用公理来声明属性的域和范围。例如,如果你有公理
p 拥有域 C
那么任何被 p 与其他东西相关的东西都必须是一个 C。同样,如果你有公理
p 的范围是 D
那么任何与p相关的东西都必须是一个D。有趣的是,范围公理实际上可以重铸为涉及通用限制的子类公理。您可以将 p 具有范围 D 写为
⊤ ⊑ ∀p.D
上面写着 ⊤ (或owl:Thing,即一切)是这样的,它的每个 p 值都必须是 D。通过使用逆属性,您也可以获得域公理。 p 有域 C 等价于
⊤ ⊑ ∀p-1.C
所有这些都是您问题答案的背景知识:
如果我想表示“一个学生必须只有一个
识别”,我认为我可以:
定义属性的域和范围(例如,:hasId
rdfs:域:学生; :hasId rdfs:range :Identification) 并制作
属性函数。
定义属性并在学生类中创建限制:
“有 1 个标识”。
那么,就语义而言,这是否相同?如果相同,是
在约定或最佳实践方面有首选方案吗?
首先,这些不一样。选项 1 将确保您随时拥有
x hasId y
x hasId z
您将能够推断出 x 是学生,y 和 z 是标识,并且 y 必须与 z 相同(因为该属性是功能性的),但您不 em> 有能力推断每个学生都有一个身份。在 OWL 中声明一个属性具有功能性意味着每个人最多拥有一个属性值,即没有值,或者只有一个值。它实际上相当于最大基数限制。说 hasId 是函数式的意思是一样的
⊤ ⊑ ≤1 hasId.⊤
您的第二个选择是更好的选择。如果你想说学生只有一个身份,那么你可以显式断言
学生 ⊑ =1 hasId.Identification
这里有一些多余的信息,但是,如果你已经声明 hasId 的域和范围分别是 Student 和 Identification,因为你已经知道作为 hasId 断言对象的每一件事都是识别,你可以等价的说
学生 ⊑ =1 hasId.⊤
我认为这里最好的选择是对你的域和范围更宽容一点,对你的子类公理更明确一点。毕竟,非学生通常可以拥有身份证明(例如,驾驶执照),而学生实际上可以拥有多个身份证明(例如,学生证和驾驶执照)。鉴于此,您可能会这样做,然后:
类
- 人
- 学生{⊑ =1 hasId.StudentIdentification}
- 标识
属性
(即使这样也有一些问题,因为一个学生可能是多个学校的学生,但这是一个单独的问题。)