Drools DRL使用OR时变量实例化疑问及特定取值需求咨询
Drools规则变量匹配问题
现有规则与事实情况
现有规则条件:
$entity: (Entity(field != null) or Entity(field == null))
当Drools会话中存在以下两个事实时:
Entity(field = null)Entity(field = "Some Value")
疑问与解决方案
1. 变量$entity会指向哪一个事实?
你的规则条件本质是匹配所有Entity类型的事实(因为任何Entity的field要么为null,要么不为null)。当两个事实同时存在时,规则会触发两次:第一次$entity指向Entity(field = null),第二次指向Entity(field = "Some Value"),触发顺序由Drools内部匹配逻辑决定,没有固定优先级。
2. 如何让$entity优先存储Entity(field = "Some Value")?
可以通过两种方式实现优先匹配field非空的Entity:
方式1:拆分规则并设置优先级
定义两个规则,给优先匹配的规则设置更高优先级(salience值越大优先级越高),同时用约束确保低优先级规则仅在无匹配的高优先级事实时触发:
rule "优先匹配field非空的Entity" salience 100 lock-on-active true when $entity: Entity(field != null) then // 此处添加你的业务处理逻辑 System.out.println("匹配到非空field的Entity: " + $entity.getField()); end rule "匹配field为空的Entity" salience 50 when $entity: Entity(field == null) // 仅当不存在field非空的Entity时触发 not Entity(field != null) then // 此处添加你的业务处理逻辑 System.out.println("匹配到空field的Entity: " + $entity.getField()); end
方式2:单个规则内添加约束逻辑
在单个规则中通过条件判断,优先匹配field非空的Entity,仅当无此类事实时才匹配空值的:
rule "优先选择非空field的Entity" when // 优先匹配非空field的Entity;若无则匹配空field的 (exists Entity(field != null) and $entity: Entity(field != null)) or (not exists Entity(field != null) and $entity: Entity(field == null)) then // 此处添加你的业务处理逻辑 String fieldValue = $entity.getField() != null ? $entity.getField() : "null"; System.out.println("匹配到的Entity: " + fieldValue); end
内容的提问来源于stack exchange,提问作者RIGOBERTO B.
相关产品推荐
相关产品推荐

