Protege使用swrl:等于比较数据类型属性

时间:2017-04-21 13:23:24

标签: owl swrl

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

  1. 消息
  2. Ham
  3. 垃圾邮件
  4. 2个dataproperties,domain:消息和范围xsd:string:

    1. hasInterest
    2. hasCategory
    3. 2 SWRL规则: 消息(?x),hasInterest(?x,?a),hasCategory(?x,?b),swrl:equal(?a,?b) - > Ham(?x)

      消息(?x),hasInterest(?x,?a),hasCategory(?x,?b),swrl:notEqual(?a?b) - >垃圾邮件(?x)

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

      这项工作正常如果我有1个消息类别和1个兴趣 例如: m1有兴趣爱好运动 m1 hasCategory sports

      那么如果我有一个列表的迭代或类别ex: 每封邮件都有超过1个兴趣{sports,movies} 每条消息都有超过1个类别{电影,政治}

      我想说如果两个列表相交,则消息为ham,因此swrl:equal不起作用我如何定义它来比较所有个体

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

1 个答案:

答案 0 :(得分:0)

SWRL Built-Ins for Strings(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)