【发布时间】:2017-06-06 10:16:23
【问题描述】:
我在 Protege 的 Jess Tab 中有一个问题,我正在构建一个包含 1 个消息类和 3 个实例的本体:消息 1 消息 2 消息 3,每个都有 3 个数据类型属性:类别、兴趣、类。对于我想要的每条消息如果类别和兴趣相同,则将其分类为 ham,否则为垃圾邮件。分类应使用 Jess 规则完成,根据该规则,类槽/属性应更改为 ham 或垃圾邮件,因此我使用 modify-instance 作为利益消息实例可能会随时间变化,因此它不是静态分类(或者我需要重新分类) 这是 protege 中 message1 的示例:
所以我使用 Jess Tab 将实例映射到 Jess Engine:
以下是我的规则截图: 当我键入(运行)时,Jess 引擎只会正确分类 1 个实例,即 message3 最后一个实例,我的意思是我必须一次只向引擎发送 1 个实例,否则它不会正确分类所有消息。
我尝试以其他方式打印分类值并且它可以正常工作(在我的示例中,3 条消息应归类为 ham )
当我添加两个规则时,结果是“火腿/垃圾邮件”打印进入了 for 循环。我之前问过一个问题,我得到的答案是无限循环发生,因为规则不断触发,因为动作(RHS)中的“if”总是正确的:
这是 Jess 的一个特性,它会考虑最后收到的实例。有没有办法强制 Jess 引擎一次考虑多条消息?为什么会发生无限循环?
我真的被这部分困住了,迫切需要速度来完成我的论文。因此,感谢您的帮助。 (我已经在 Protege 中的 swrl busing SWRL+Jess Tab 中实现了这些规则,并且规则运行良好,问题是事实在本体中被断言,我希望它们被修改而不是断言,所以这就是我使用 Jess Rules 的原因,你认为我在写作轨道上,或者我应该更好地使用 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)))
【问题讨论】:
-
文字不太适合表达你的真正意思。你没有任何代码证明你的问题吗?
-
我将添加屏幕截图,让我重新定义它我的意思是实例槽值一次只修改 1 个实例,如果我有 i1 和 i2,并且我有一个修改槽值的 jess 规则一个实例,我用实例映射了类,只有 i2 的插槽值会改变,而 i1 不会
-
您现在似乎已经多次问过同一个问题,但没有任何回应,因为如被问及,问题无法回答:您需要显示一些代码。
-
就 Jess 规则引擎本身而言,如果您编写一个匹配并修改一个事实的规则,并且有十个匹配的事实,那么当您运行引擎时,所有十个事实将被修改,只要修改一个事实不会以某种方式使规则不再匹配。但那是 Jess 自己的事情,而且你有多层第三方软件堆积在它上面。您需要使用最简单的完整示例准确地向我们展示您在做什么,也许有人可以告诉您您做错了什么。
-
我用详细的例子和问题编辑了问题,请帮忙。