Drools决策表操作执行顺序
我有一个Drools决策表(见下文),其中规则2有一个条件,该条件检查营养分值是否在某个阈值之间,并根据该条件执行操作。有一个执行检查并执行其操作的初始规则(规则1),它更新我希望规则2在执行其条件时使用的总分数。
我的期望/需要:
要运行的规则1,如果满足条件,则更新$Model的总分数(通过执行其操作),然后运行规则2,并且规则2的条件使用由规则1的操作运行更新的分数值。
实际发生了什么
规则1运行其条件,规则2运行其条件,规则1的操作运行,规则2的操作运行。规则%2在运行规则%1的操作之前正在运行其条件,因此使用过时的分数。我已经证明(我认为)通过更改优先级/显著性值,我可以更改规则运行其条件的顺序,但似乎所有规则条件都在操作之前运行。我希望规则1的操作在下一条规则之前运行。
我从根本上误解了这个概念吗?一个明显的错误?或者,如果任何人有建议的解决办法,那将是非常好的。
澄清一下,这是一个无状态KI会话。
提前谢谢,这快把我逼疯了!
解决方案
Drools的工作方式是预先获取所有规则并评估它们的条件是否满足。这些规则中的每一条都称为匹配。当您启动规则时,Drools会收集所有匹配项,对它们进行排序(自然或按重要性排序),然后遍历并逐个执行它们。
在执行规则时,它们可能会像您的示例一样改变工作记忆。但是,除非您显式地告诉Drools您正在这样做,否则它不会重新评估匹配。执行规则时,匹配阶段已完成。
可以告诉Drools您正在修改工作内存,并且需要它根据新数据重新评估其规则。为此,您需要使用内置方法之一:
方法 | 说明 |
---|---|
insert |
将新事实放入工作内存。 |
delete 或retract |
从工作内存中删除某些信息(对象)。 |
update |
更新/替换工作内存中的事实。 |
modify |
更改工作内存中数值内的字段。 |
您选择哪一个取决于您要尝试做什么。请注意,调用‘UPDATE’将调用要重新评估的所有匹配...这相当于使用新数据第二次调用FIRE规则(因此,同一规则可能会多次命中,这可能是故意的,也可能不是故意的)。相比之下,insert
将仅评估后续规则,以确定它们现在是否基于新条件匹配。
因此,如果您打算通过更改工作内存中的数据来触发或不触发其他规则,您将需要使用这些内置方法之一来告诉Drools您正在进行更改,它应该重新评估其匹配项。
我将在this answer中更详细地讨论这个概念,特别是关于DRL。同样的概念也适用于决策表。相关文章