我在Protege的Jess Tab中有一个问题,我正在构建一个类消息和3个实例的本体:消息1消息2消息3,每个3个数据类型属性:类别,兴趣,类。对于我想要的每个消息如果类别和兴趣相等则将其归类为火腿,否则为垃圾邮件。分类应使用Jess规则进行,类槽/属性应更改为火腿或垃圾邮件,因此我使用modify-instance作为消息实例可能会随时间变化,因此它不是静态分类(或者我需要重新分类) 以下是protege中message1的示例:
所以我使用Jess Tab将所示的实例映射到Jess Engine:
以下是我的规则截图: 当我输入(运行)时,Jess引擎只会正确地分类1个实例,即message3是最后一个实例,我的意思是因此我必须一次只向发动机发送一个实例,否则它不会正确地对所有消息进行分类。
我试图以其他方式打印分类值并且它正常工作(在我的示例中,3条消息应该被归类为火腿)
当我添加两条规则时,结果就是" ham / spam"打印进入for循环。之前我已经问了一个问题,我得到了一个无限循环发生的答案,因为规则会继续作为" if"在行动(RHS)总是正确的:
这是Jess的一个特性,它认为是最后收到的实例。有没有办法强制Jess引擎一次考虑多条消息?为什么无限循环发生?
我真的陷入了这一部分,迫切需要速度来完成我的论文。所以,你的帮助表示赞赏。 (我已经在swrl busing SWRL + Jess Tab in Protege中实现了这些规则,规则工作正常,问题是事实在本体中被断言,我希望它们被修改而不是断言,这就是我使用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)))
答案 0 :(得分:0)
这可能不是一个真正的答案,但您应该考虑相应地更改您的代码,如果问题仍然存在,请编辑您的问题。
请勿在右侧使用(if)
。如果由于事实中的值而存在两种不同的情况,则按规则区分它们。
不要只使用一个操作数(if)
。这将永远返回true。
要避免循环,请使用规则属性no-loop或添加一个为true的条件,除非右侧已更改某些内容。
在与Protege图层进行摔跤之前,我会首先在普通的Jess中测试规则。