我对使用域、范围和限制来定义本体的正确方法有疑问。如果我想代表“学生必须只有一个身份证明”,我认为我可以做以下其中一项:
:hasId rdfs:domain :Student; rdfs:range :Identification
)并使属性起作用。 在语义方面,这些是同一个意思吗?如果是这样,在惯例或最佳实践方面是否有首选方案?最后,同样适用于数据类型属性吗?我可以简单地定义域/范围和/或我应该在类中创建限制以将其与属性链接吗?
最佳答案
OWL2 有量化的限制,这意味着你可以有以下形式的类表达式
∃p.C
这表示具有 C 类型属性 p 值的个人类别。类似地,您可以使用限制
∀p.D
这是一类个体,其属性 p 的所有值(尽管可能没有任何值)都是 D 类型。还有数字限制,因此您可以指定值的最小数量、值的最大数量,或确切数量的值。
≤n p.C
≥n p.C
=n p.C
您还可以使用公理来声明属性的域和范围。例如,如果你有公理
p has domain C
那么任何由 p 与其他事物相关的东西都必须是 C。同样,如果你有公理
p has range D
那么与 p 相关的任何事物都必须是 D。有趣的是,范围公理实际上可以重新转换为涉及普遍限制的子类公理。您可以将 p 的范围写为 D
⊤ ⊑ ∀p.D
这表明 ⊤ (或
owl:Thing
,即一切)使得 p 的每个值都必须是 D。通过使用逆属性,您也可以获得域公理。 p 有域 C 等价于⊤ ⊑ ∀p-1.C
所有这些都是回答您的问题的一些背景知识:
If I want to represent that “A student must have only one identification”, I think that I could:
Define the domain and range for the property (for example, :hasId rdfs:domain :Student; :hasId rdfs:range :Identification) and make the property functional.
Define the property and create a restriction in the student class: “hasId exactly 1 Identification”.
So, in terms of semantics is this the same? If it is the same, is there a preferred option in terms of conventions or best practices?
首先,这些不一样。选项 1 将确保您在任何时候
x hasId y
x hasId z
您将能够推断出 x 是学生,y 和 z 是标识,并且 y 必须与 z 相同(因为该属性是函数式的),但您无法推断出每个学生有身份证。在 OWL 中声明一个属性是功能性的,表示每个人最多有一个属性值,即没有值或一个值。它实际上相当于最大基数限制。说 hasId 是功能性的就等于说
⊤ ⊑ ≤1 hasId.⊤
您的第二个选择是更好的选择。如果你想说学生只有一个身份,那么你可以明确和断言
Student ⊑ =1 hasId.Identification
但是,这里有一些冗余信息,如果您已经声明 hasId 的域和范围分别是 Student 和 Identification,因为您已经知道作为 hasId 断言对象的每件事都是一个 Identification,您可以等效地说
Student ⊑ =1 hasId.⊤
我认为这里最好的选择是对您的域和范围更加宽容,并且对您的子类公理更加明确。毕竟,非学生通常可以拥有身份证件(例如驾照),而学生实际上可以拥有多个身份证件(例如,学生证和驾照)。鉴于此,你可能会做这样的事情,然后:
类(class)
特性
(即使这样也有一些问题,因为一个学生可能是多所学校的学生,但这是一个单独的问题。)
关于rdf - 猫头鹰-DL : property restrictions and/or domain-range?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21843521/