“如果那么其他”用规则引擎

时间:2011-11-03 10:53:37

标签: java rules drools rule-engine

我是drools的新手并且给出了条件(Condition)和布尔变量“a”,我想用drools创建以下规则:

if (Condition)
   { 
    a = true;
   }
else
   {
    a = false;
   }

最好的方法是什么?

暂时我有两个选择:

1.用条件创建2条规则而不是条件(如果......那么......,如果不是......那么......)

rule "test"
where
  $o: Object( Condition)
then 
  $o.a = true;
end


rule "test2"
where
  $o: Object( not Condition)
then 
  $o.a = false
end

2.默认情况下将变量a设置为false,然后触发规则

rule "test"
no loop
salience 100
where 
  $o: Object()
then 
  $o.a = false;
end


rule "test"
where
  $o: Object( not Condition)
then 
  $o.a = true;
end

2 个答案:

答案 0 :(得分:3)

本质上,Rete引擎会查找正匹配,所以是的,您需要多个规则,一个用于if-then-else块中的每个条件检查。你的第一个例子更干净,更直观,我会继续这样做。

作为替代方案,如果您正在处理一个简单的逻辑否定(if-else),其中您的变量值与条件匹配,那么您只能使用一个规则:

rule "test"
where 
  $o: Object()
then 
  $o.a = (! Condition);
end

答案 1 :(得分:1)

请记住,规则引擎不仅仅是IF / ELSE容器。你正在改变命令式的方法 if(condition){} else {} 一种声明式方法,让你根据工作记忆中的上下文(事实)让引擎决定和评估规则。

有两个规则很好,但你究竟想要实现什么?根据您要实现的对象结构和业务逻辑,有几种方法可以解决不同的问题。你能告诉我们你想要达到的目标的更多细节吗? 干杯