我在 Protege 的 Jess Tab 中有一个问题,我正在构建一个包含 1 个消息类和 3 个实例的本体:消息 1 消息 2 消息 3,每个都有 3 个数据类型属性:类别、兴趣、类。对于每条消息,我想将其分类为如果类别和兴趣相同,则为 ham,否则为垃圾邮件。分类应使用 Jess 规则完成,根据该规则,类插槽/属性应更改为 ham 或垃圾邮件,因此我为此使用 modify-instance,因为消息实例的兴趣可以随时间变化,所以它不是一个静态分类(或者我需要重新分类它)这是 protege 中 message1 的一个示例:
所以我使用 Jess Tab 将实例映射到 Jess Engine :
这是我的规则的屏幕截图: 当我键入(运行)时,Jess 引擎将只正确分类 1 个实例,即最后一个实例 message3,我的意思是我必须一次只向引擎发送 1 个实例,否则它不会' t 正确分类所有消息。
我试图以其他方式打印分类值并且它工作正常(在我的示例中,3 条消息应归类为 ham )
当我添加这两个规则时,结果是“火腿/垃圾邮件”打印进入了 for 循环。我之前问过一个问题,我得到的答案是发生无限循环,因为规则不断触发,因为动作(RHS)中的“if”总是正确的:
这是 Jess 的一个功能,它认为最后收到的实例。有没有办法强制 Jess 引擎一次考虑多条消息?为什么会发生无限循环?
我真的被困在这部分,迫切需要速度来完成我的论文。因此,感谢您的帮助。(我已经在 Protege 中的 swrl busing SWRL+Jess Tab 中实现了这些规则,并且这些规则运行良好,问题是事实在本体中被断言,我希望它们被修改而不是断言,所以这就是我使用 Jess 规则的原因,你认为我在写作轨道上,或者我应该更好地使用 Sweet Rules?)
我通过对事实的槽值进行限制但没有更改来更新规则如下:
(defrule MAIN::test2
(object (is-a http://www.owl-ontologies.com/Ontology1496039955.owl#Message) (OBJECT ?o))
(object (OBJECT ?o) (http://www.owl-ontologies.com/Ontology1496039955.owl#interests $?i))
(object (OBJECT ?o) (http://www.owl-ontologies.com/Ontology1496039955.owl#category $?c&:(eq (intersection$ $?i $?c) )))
(object (OBJECT ?o) (http://www.owl-ontologies.com/Ontology1496039955.owl#class $?cl&:(neq $?cl "spam")))
=>
(modify-instance ?o (http://www.owl-ontologies.com/Ontology1496039955.owl#class spam)))