Drools决策表操作执行顺序

Drools Decision Table Action Execution Order(Drools决策表操作执行顺序)

本文介绍了Drools决策表操作执行顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Drools决策表(见下文),其中规则2有一个条件,该条件检查营养分值是否在某个阈值之间,并根据该条件执行操作。有一个执行检查并执行其操作的初始规则(规则1),它更新我希望规则2在执行其条件时使用的总分数。

我的期望/需要:

要运行的规则1,如果满足条件,则更新$Model的总分数(通过执行其操作),然后运行规则2,并且规则2的条件使用由规则1的操作运行更新的分数值。

实际发生了什么

规则1运行其条件,规则2运行其条件,规则1的操作运行,规则2的操作运行。规则%2在运行规则%1的操作之前正在运行其条件,因此使用过时的分数。

我已经证明(我认为)通过更改优先级/显著性值,我可以更改规则运行其条件的顺序,但似乎所有规则条件都在操作之前运行。我希望规则1的操作在下一条规则之前运行。

我从根本上误解了这个概念吗?一个明显的错误?或者,如果任何人有建议的解决办法,那将是非常好的。

澄清一下,这是一个无状态KI会话。

提前谢谢,这快把我逼疯了!

推荐答案

Drools的工作方式是预先获取所有规则并评估它们的条件是否满足。这些规则中的每一条都称为匹配。当您启动规则时,Drools会收集所有匹配项,对它们进行排序(自然或按重要性排序),然后遍历并逐个执行它们。

在执行规则时,它们可能会像您的示例一样改变工作记忆。但是,除非您显式地告诉Drools您正在这样做,否则它不会重新评估匹配。执行规则时,匹配阶段已完成。

可以告诉Drools您正在修改工作内存,并且需要它根据新数据重新评估其规则。为此,您需要使用内置方法之一:

方法 说明
insert 将新事实放入工作内存。
deleteretract 从工作内存中删除某些信息(对象)。
update 更新/替换工作内存中的事实。
modify 更改工作内存中数值内的字段。

您选择哪一个取决于您要尝试做什么。请注意,调用‘UPDATE’将调用要重新评估的所有匹配...这相当于使用新数据第二次调用FIRE规则(因此,同一规则可能会多次命中,这可能是故意的,也可能不是故意的)。相比之下,insert将仅评估后续规则,以确定它们现在是否基于新条件匹配。

因此,如果您打算通过更改工作内存中的数据来触发或不触发其他规则,您将需要使用这些内置方法之一来告诉Drools您正在进行更改,它应该重新评估其匹配项。

我将在this answer中更详细地讨论这个概念,特别是关于DRL。同样的概念也适用于决策表。

这篇关于Drools决策表操作执行顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:Drools决策表操作执行顺序

基础教程推荐