规则触发异常排查:高Salience规则未触发低优先级规则触发
核心问题:规则前置条件与事实不匹配
你遇到的问题本质是rule_10和rule_11的前置条件未被满足,所以即使优先级更高也不会触发,而rule_12能触发说明它的条件恰好匹配(或你提供的代码/事实存在描述误差),具体原因拆解如下:
TextChoiceOption的SKU不匹配
你的事实中TextChoiceOption的sku是"control",但rule_10、rule_11、rule_12的规则里都要求匹配sku == "motorControl"。按此逻辑,三个规则都不应触发,但你说rule_12触发了,说明要么你提供的事实有误(实际TextChoiceOption的sku是"motorControl"),要么rule_12的实际代码中SKU条件是"control"而非"motorControl"。
这是rule_10和rule_11无法触发的最直接原因。存在条件(exists)的结构不匹配
规则中通过exists (OptionValue(optionValueValue in ("xxx")) from $opt.value)来校验选项值,但你的事实里TextChoiceOption是直接携带optionValueValue = "xxx"属性,而非value字段包含OptionValue对象。如果事实结构确实如此,这个exists条件是不满足的,三个规则都不应触发——这进一步说明你提供的代码或事实存在描述误差。数据类型不一致的比较风险
规则中DimensionOption的条件使用字符串(如widthValue <= "72")和数字类型的widthValue/heightValue做比较,在Drools中可能引发非预期的字典序比较结果(比如数字8转成字符串"8"会被判定为大于"72")。应改为数字比较:DimensionOption(sku == "dim", widthValue <= 72, heightValue <= 120)
修复建议
- 修正TextChoiceOption的SKU条件,确保与事实中的sku一致(要么把规则里的
"motorControl"改成"control",要么调整事实中的sku为"motorControl")。 - 调整exists条件的写法,匹配事实结构:如果TextChoiceOption直接有
optionValueValue属性,可简化为:TextChoiceOption(sku == "control", optionValueValue == "xxx") - 统一Dimension条件的比较类型,用数字替代字符串进行数值比较。
内容的提问来源于stack exchange,提问作者Jeff

