我正构建了3个类的本体:
2个dataproperties,domain:消息和范围xsd:string:
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中比较它们?
答案 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)