0

我正在构建 3 个类的本体:

  1. 留言
  2. 火腿
  3. 垃圾邮件

2个数据属性,域:消息和范围xsd:字符串:

  1. 有兴趣
  2. 有类别

2 SWRL 规则:Message(?x),hasInterest(?x,?a),hasCategory(?x,?b), swrl:equal(?a,?b) ->Ham(?x)

Message(?x),hasInterest(?x,?a),hasCategory(?x,?b), swrl:notEqual(?a?b) ->Spam(?x)

我想将 Message 类的实例分类为 Spam 或 Ham 类;如果 hasCategory 值(邮件类别)等于 hasInterest 值(用户兴趣),则该邮件为 ham 否则为垃圾邮件

如果我有 1 个消息类别和 1 个兴趣,这可以正常工作: m1 hasInterests sports m1 hasCategory sports

那么,如果我有一个 iterests 或类别列表,例如:每条消息有超过 1 个兴趣{体育、电影}每条消息有超过 1 个类别 {电影、政治}

我想说如果两个列表相交那么消息是火腿所以 swrl:equal 不起作用我如何定义它来比较所有个人

我所做的是重复 hasInterests 和 hasCategory 取决于我的意思是手动定义列表的各个值并且它有效,是否有另一种使用字符串列表的自动方式以及如何在 swrl 中比较它们?

4

1 回答 1

1

SWRL 字符串内置函数 ( http://www.daml.org/rules/proposal/builtins.html ) 仅支持简单的字符串函数。在您的模型中,您可以对m1具有许多兴趣和许多类别的消息个体进行建模,如下所示:

m1 hasInterests "sports", m1 hasInterests "movies" 
m1 hasCategory "sports", m1 m1 hasCategory "movies" 

和你的规则

Message(?x),hasInterest(?x,?a),hasCategory(?x,?b), swrl:equal(?a,?b) ->Ham(?x)

每条消息至少有一个兴趣等于一个类别Ham

也许有用的提示可以找到兴趣数量,但使用 SQWRL 查询:

Message(?x) ^ hasInterest(?x,?a) → sqwrl:select(?x) ^ sqwrl:count(?a)
于 2018-03-08T10:21:26.757 回答