1

目前我正在开发一个本体来表示特定用户可能对某事有的偏好。例如,用户可能将MediaVolumeLevel偏好设置为VolumeLevel_3

不同级别(班级的个人MediaVolumeLevel)是: VolumeLevel_1, VolumeLevel_2, VolumeLevel_3 and VolumeLevel_4

user 和 Preference 由 objectProperty 链接hasMediaVolumeLevelPreference

objectProperty 断言需要通过 SWRL 规则从其他 User 方面推断出来。例如,如果用户有听力障碍,则MediaVolumeLevel需要设置为VolumeLevel_4.So:

User(?u), hasDifficulty(?u,Hearing) -> hasMediaVolumeLevelPreference(?u,VolumeLevel_4)

这工作正常。但是,由于我还有其他 SWRL 规则也可以MediaVolumeLevel为相同的用户推断,例如:

User(?u), hasContext(?u,NoisyRoom) -> hasMediaVolumeLevelPreference(?u, VolumeLevel_3)

并且 SWRL 仅支持单调推理,推理器将断言 VolumeLevels (VolumeLevel_4VolumeLevel_3)。

我需要的是一条规则,以某种方式,只有在没有更高级别已经断言的情况下才会断言偏好。在给定的示例中,即使hasContext(?u,NoisyRoom)为真,唯一断言的级别应该是VolumeLevel_4因为其他规则断言了它。

对此有何建议?使用 SWRL 可以实现我想要的吗?我正在使用 Protege 4.3 和 Pellet Reasoner

谢谢,MFV。

4

1 回答 1

3

这是可能的,但仅限于某些情况。请允许我解释一下。


1)您hasMediaVolumeLevelPreference是与个人有关的对象属性VolumeLevel_1, VolumeLevel_2, VolumeLevel_3 and VolumeLevel_4。这些个体在本体中没有相对排序。作为人类设计师,你知道这VolumeLevel_4比推理者更重要,VolumeLevel_3但对于推理者来说,不存在这样的相对顺序。如果您要更改hasMediaVolumeLevelPreference为具有范围int(或long实际上)的数据属性,那么您已经在您的个人背后提供了一个具体的数据值。因此,您可以使用 swrl 比较内置函数编写规则,即swrl:greaterThan等。

2) 您现在可以将子句写入您的规则中,以便在先行词中进行比较,以便仅断言最高值,但是 SWRL 仅支持单调推理。因此,SWRL 规则不能用于修改本体中的现有信息。SWRL 规则不能从本体中撤回或删除信息。Volume_3因此,如果之前断言的音量较低,Volume_4则无法hasMediaVolumeLevelPreference(Volume_3)从本体中删除关系。

3) 一切都还没有丢失,Apache Jena 有一个规则引擎,可用于在 rdf 三重级别操作本体。您可能必须编写自己的内置函数,但您可以从 rdf 子图中删除属性和类描述。转到此处以获取有关耶拿规则的更多信息。

我希望这有帮助。

于 2015-08-29T05:06:25.697 回答