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