【问题标题】:Jess considers only the last mapped instanceJess 只考虑最后一个映射的实例
【发布时间】: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 自己的事情,而且你有多层第三方软件堆积在它上面。您需要使用最简单的完整示例准确地向我们展示您在做什么,也许有人可以告诉您您做错了什么。
  • 我用详细的例子和问题编辑了问题,请帮忙。

标签: protege jess swrl sqwrl


【解决方案1】:

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

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

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

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

我会先在纯 Jess 中测试规则,然后再与 Protege 层搏斗。

【讨论】:

  • 我不明白第一点你是什么意思两种不同的情况, no ​​-loop 属性在 protege 中不起作用它会给出错误。我会看看我能做什么。
  • if 语句根据条件区分两种情况。 - 如果不能使用 no-loop,则在 RHS 上的操作尚未执行时添加一个为 true 的约束。
  • 如果您给我一个带有代码的示例,我将不胜感激,因为我是 Jess 的新手,并专门为第二点卡住了
  • Jess 手册中有很多例子。你从前到后读过吗?
  • 没有什么特别针对保护层的问题,但我会重新检查。我用一些东西编辑了我的问题,如果你能帮助我决定(我已经在 Protege 中的 swrl busing SWRL+Jess Tab 中实现了这些规则,并且这些规则运行良好,问题是事实在本体中被断言,我希望它们被修改没有断言,所以这就是我使用 Jess Rules 的原因,你认为我在写作轨道上还是我应该更好地使用 Sweet Rules?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 2022-12-07
  • 2023-03-21
相关资源
最近更新 更多