0

我在 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)))

4

1 回答 1

0

这可能不是真正的答案,但您应该考虑相应地更改您的代码,如果您的问题仍然存在,请编辑您的问题。

不要用(if)在右手边。如果由于事实中的值而存在两种不同的情况,则用规则加以区分。

不要(if)只使用一个操作数。这将始终返回 true。

为避免循环,请使用规则属性 no-loop 或添加一个条件为真,除非右侧已更改某些内容。

在与 Protege 层搏斗之前,我会先用普通的 Jess 测试规则。

于 2017-06-07T10:49:47.890 回答