jag*_*thi 3 dsl rule-engine drools
我尝试在网上进行大量研究,但无法找到错误的确切原因
这是我的问题
我试图在 RHS (THEN) 中编写 if-else 条件,但我的口水显示以下错误
[An error occurred when attempting to build drools rule set. Error: Unable to Analyse Expression if (
Run Code Online (Sandbox Code Playgroud)
我知道这清楚地表明我不能在 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
Run Code Online (Sandbox Code Playgroud)
这对于 Drools 5.0 来说是完全有效的(不能说更早,那是我用过的最早的。)这是糟糕的规则设计——任何限制你不添加第二条规则的东西都是不正确的——但你可以右侧有一个 if/else。
规则设计不好的原因是条件应该放在条件子句(左侧,“当”)上,而右侧(那么)应该产生后果。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
Run Code Online (Sandbox Code Playgroud)
如前所述,如果必须的话,您仍然可以使用 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
Run Code Online (Sandbox Code Playgroud)
这条规则完全有效并且有效。如果它对您不起作用,则问题不在于规则,而在于您如何加载或触发您尚未共享的规则。也许这是你的方言。也许这就是你加载它们的方式。也许您的“if”中有拼写错误,例如缺少引号或连字符,您没有向我们展示这些错误,因为您没有提供实际的规则。
这是您必须在自己的环境中进行调查的事情(我建议在您的 IDE 中设置断点和调试会话。)
为了完整起见,Drools 7 引入了条件和命名后果的概念。虽然我认识的许多人更喜欢拥有多个规则的最佳实践的简单性和简化性,但这是在单个规则中提供条件处理的另一种方法。
基本上,这个想法是,如果您有两个极其相似的条件,例如一个条件是另一个条件的基础,那么您可以使用与“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
Run Code Online (Sandbox Code Playgroud)