我刚开始使用 Protégé 4.3 学习 OWL,现在我面临一个难题。我已经定义了一个具有一些限制超类的 A 类,以确保每个 A 具有来自 P1 和 P2 的属性值,并且每个 P1 和 P2 具有一个双精度值:
A ⊑ ∃hasProperty.(P1 ⊓ ∃hasValue.xsd:double)
A ⊑ ∃hasProperty.(P2 ⊓ ∃hasValue.xsd:double)
我如何断言 A 的 P1 值都小于所有 P2 值?
我刚开始使用 Protégé 4.3 学习 OWL,现在我面临一个难题。我已经定义了一个具有一些限制超类的 A 类,以确保每个 A 具有来自 P1 和 P2 的属性值,并且每个 P1 和 P2 具有一个双精度值:
A ⊑ ∃hasProperty.(P1 ⊓ ∃hasValue.xsd:double)
A ⊑ ∃hasProperty.(P2 ⊓ ∃hasValue.xsd:double)
我如何断言 A 的 P1 值都小于所有 P2 值?
这是一个有趣的问题,但不幸的是,您无法使用纯 OWL 公理来解决这个问题。通常,通过使用限制超类,很容易说出类个体所具有的值,但很难或不可能说出属性值之间的关系。例如,您不能说一个人的姓氏属性必须与姓氏属性的值相同。
不过,首先澄清一些术语很重要,尤其是术语限制:
我想定义一个限制,对于 A 的所有个体,p1 的值总是小于 p2 的值
限制是一个类。例如,限制likes some Person
是每个人都喜欢某个人的个人类别。我们经常使用限制作为其他类的超类来确保某些约束成立。例如,当我们这么说时
Person subClassOf hasName 一些 xsd:string
我们是说每个人都有一个属性 hasName 的值,它是一个 xsd:string。
您可以断言,如果某物是 A 的成员并且具有 p1 和 p2 值,则 p1 必须小于 p2。这看起来像:
A(?a) ∧
hasProperty(?a,?p1) ∧ P1(?p1) ∧ hasValue(?p1,?v1) ∧
hasProperty(?a,?p2) ∧ P2(?p2) ∧ hasValue(?p2, ?v2)
→
swrlb:lessThan(?v1,?v2)
这将确保 A 上的每个 P1 值都小于 A 上的每个 P2 值。如果您曾经断言某些数据违反了这一点,那么就会出现不一致。