Drools 决策 Table 操作执行顺序

Drools Decision Table Action Execution Order

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

我expect/need:

规则 1 到 运行,如果满足条件则更新 $model 的总分(通过执行其操作),然后是规则 2 运行 以及使用更新后的条件由规则 1 的操作更新的得分值 运行ning.

实际发生了什么

规则 1 运行是条件,规则 2 运行是条件,规则 1 的操作是 运行,规则 2 的操作是 运行。规则 2 运行在规则 1 的操作具有 运行 之前设置它的条件,因此使用过时的分数。

我已经证明(我认为)通过改变 priority/salience 值我可以改变规则 运行 条件的顺序,但似乎所有规则条件都是 运行宁在行动之前。我希望规则 1 的操作在下一条规则之前 运行。

我是不是从根本上误解了这个概念?一个明显的错误?或者,如果有人有建议的解决方法,那就太好了。

澄清一下这是一个无状态的 ki 会话。

提前致谢,这让我抓狂!

Drools 的工作原理是预先考虑所有规则并评估它们的条件是否得到满足。这些规则中的每一个都称为“匹配”。当您触发规则时,Drools 会收集所有匹配项,对它们进行排序(自然或显着),然后逐一迭代并执行它们。

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

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

Method Explanation
insert Put a new fact into working memory.
delete or retract Removes some information (object/s) from working memory.
update Update/replace a fact in working memory.
modify Change fields inside of a fact in working memory.

你选择哪一个取决于你想做什么。请注意,调用 'update' 将调用 all 匹配项进行重新评估......这相当于用新数据第二次调用“fire rules”(所以相同规则可能会命中多次,这可能是故意的,也可能不是故意的)。相比之下,insert 将仅评估 后续 规则以确定它们现在是否匹配或不基于新条件。

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

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