我正在构建一个由三个类组成的本体:
2数据属性、域:消息和范围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) ->Spam(?x)
我希望将类消息的实例分类为类垃圾邮件或哈姆;如果hasCategory值(消息类别)等于hasInterest值(用户兴趣),则该消息是Ham else垃圾邮件。
如果我有一个消息类别和一个兴趣对象: m1 hasInterests体育m1 hasCategory体育,这是正确的。
那么,如果我有一个迭代或类别列表(例如:每条消息有超过一个兴趣(体育,电影}),每个消息有超过一个类别{电影,政治}
我想说,如果这两个列表相交,那么消息就是ham,所以swrl:equal不起作用,我如何定义它来比较所有的个体?
我所做的是重复hasInterests和hasCategory,这取决于我所指的手动定义列表的各个值,它是否有效,还有另一种使用字符串列表的自动方法,以及如何在swrl中比较它们呢?
发布于 2018-03-08 10:21:26
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)
https://stackoverflow.com/questions/43543913
复制相似问题