目前,我正在开发一种本体来表示特定用户可能对某些内容的偏好。例如,用户可能会将MediaVolumeLevel
首选项设置为VolumeLevel_3
。
不同级别(班级MediaVolumeLevel
的个人)是:
VolumeLevel_1, VolumeLevel_2, VolumeLevel_3 and VolumeLevel_4
。
用户和首选项由objectProperty hasMediaVolumeLevelPreference
链接。
需要通过SWRL规则从其他用户方面推断出objectProperty断言。例如,如果用户有听力困难,则MediaVolumeLevel
需要设置为VolumeLevel_4.
所以:
User(?u), hasDifficulty(?u,Hearing) -> hasMediaVolumeLevelPreference(?u,VolumeLevel_4)
这很好用。但是,由于我有其他SWRL规则也推断相同用户的MediaVolumeLevel
,例如:
User(?u), hasContext(?u,NoisyRoom) -> hasMediaVolumeLevelPreference(?u, VolumeLevel_3)
并且SWRL仅支持单调推理,推理器将断言VolumeLevels(VolumeLevel_4
和VolumeLevel_3
)。
我需要的是一条规则,如果没有更高级别已经断言,那么它将仅以某种方式断言偏好。在给定的示例中,即使hasContext(?u,NoisyRoom)
为真,唯一断言的级别应为VolumeLevel_4
,因为其他规则断言它。
对此有何建议?我想要什么可能使用SWRL? 我使用的是Protege 4.3和Pellet Reasoner
谢谢,MFV。
答案 0 :(得分:2)
这是可能的,但仅限于某些情况。请允许我解释一下。
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子图中删除属性和类描述。有关耶拿规则的更多信息,请转到here。
我希望这有帮助。