You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drools规则then子句多次触发,如何完成when块判断后再执行then

问题1:规则多次触发如何调整为仅执行一次

触发多次的原因

Drools对规则中or连接的条件会拆分为多条独立的匹配路径,每有一条路径匹配成功,就会触发一次then块的执行。你当前有3个条件分支满足,因此会打印三次日志。

解决方法

使用exists关键字包裹整个when条件块,exists的语义是只要工作内存中存在至少一组匹配整体条件的事实,就仅触发一次规则执行,不管有多少个分支匹配成功。修改后的规则如下:

rule "matematikk"
when
  exists (
    (Class( code == "MAT1003") or Class( code == "MAT1008"))
    or
    (Class( code == "REA3022") or Class( code == "REA3024") or Class( code == "REA3026") or Class( code == "REA3028"))
    or
    ((Class(code == "MAT1006") and Class(code == "MAT1010")) or (Class( code == "MAT1001") and Class( code == "MAT1005")))
    or
    (Class(code == "MAT1002") or Class(code == "MAT1007"))
  )
then
  logger.info("passed");
end

这里额外给and相关的条件加了括号,避免优先级问题导致逻辑和你预期不符。


问题2:删除or后规则不执行的原因

Drools的when块中,多个模式未显式指定逻辑运算符时,默认是逻辑与关系,即要求所有列出的模式都要在工作内存中同时匹配成功。
你删除所有or之后,规则的匹配条件变为需要同时存在MAT1003、MAT1008、REA3022、REA3024、REA3026、REA3028、MAT1006、MAT1010、MAT1001、MAT1005、MAT1002、MAT1007所有code对应的Class对象,实际场景下不可能同时满足该条件,因此规则不会触发,没有执行结果。

内容的提问来源于stack exchange,提问作者Goozo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:36:04