如果 THEN 子句中的条件流口水

If condition in THEN clause drools

我尝试了很多在线研究,但无法找到错误的确切原因

这是我的问题

我正在尝试在 RHS (THEN) 中编写 if-else 条件,但我的流口水显示以下错误

[An error occurred when attempting to build drools rule set. Error: Unable to Analyse Expression if (

我知道这清楚地表明我不能在 THEN (RHS) 中写入 if,但我能够在 drools 版本 6.5.0-FINAL 中完成

它是在 6.5.0 版本中引入的东西吗?请指导我正确的调查方向

我无法为此创建两个规则我需要在 THEN 中使用 if-else 条件

我的 drools 版本是 5.5.0

rule "TEST"
when
     $aa : Age()
then
     if(//something)
     {
        //something
     }
     else
     {
     }
end

这在回到 Drools 5.0 时是完全有效的(不能说更早,那是我用过的最早的版本。)这是糟糕的规则设计——任何限制你不添加第二条规则的东西都是不正确的-- 但你可以在右侧有一个 if/else。

原因规则设计不好是条件应该在条件子句(左侧,'when')和右侧(then)应该有后果。 Drools 优化了 LHS 上的条件检查,但按原样在 RHS 上执行结果。因此,通过将条件移动到 RHS,您会导致规则性能降低,因为您绕过了 Drools 提供的优化。

正确的 方法是——正如您可能已经想到的——有如下两个规则。 (由于我不知道您的特定使用问题,所以我要弥补一些东西——结果的差异取决于年龄是大于还是小于 18 岁。)

rule "TEST - Under 18"
when
  Age( value < 18 )
then
  System.out.println("User is underage.");
end

rule "TEST - Adult"
when
  Age( value >= 18 )
then
  Sytem.out.println("User is an adult.");
end

如前所述,如果必须,您仍然可以使用 if-else,但这是糟糕的规则设计,如果我正在做您的代码审查,我会把它发回修改。 :)

rule "TEST WITH BAD PRACTICES"
when
  Age( $age: value )
then
  if ($age < 18) {
    System.out.println("User is underage.");
  } else  {
    System.out.println("User is an adult.");
  }
end

这条规则完全有效并且有效。如果它对您不起作用,则问题不在于规则,而在于您如何加载或触发您尚未共享的规则。也许这是你的方言。也许这就是您加载它们的方式。也许您的 'if' 中有错字,例如缺少引号或连字符,您没有向我们展示这些错误是因为您没有提供 实际 规则。

这是您必须在自己的环境中调查的内容(我建议在您的 IDE 中设置断点和调试会话。)


为了完整起见,Drools 7 引入了conditional and named consequences 的概念。虽然我认识的许多人更喜欢拥有多个规则的最佳实践的简单性和流线型,但这是在单个规则中提供条件处理的另一种方法。

基本上这个想法是,如果您有两个极其相似的条件,例如一个条件建立在另一个条件之上,您可以使用与“goto”非常相似的语法来触发右侧的排列。以下是您可能会根据自己的情况执行此操作的方法:

rule "TEST with named consequences"
when
  Age( $age: value )
  if ( $age  < 18 ) break[underage]
then
  System.out.println("User is an adult.");
then[underage]
  System.out.println("User is underage.");
end