Drools规则格式仅触发一次

Nix*_*ixx 2 java rule-engine drools

我正在使用drools 6引擎.假设我有一个帐户对象,其中包含一系列部分,每个部分都有一个状态标志,可以是"GOOD"或"BAD".如果我要写下面的内容:

rule "Check if account has a good subsection"
when
    $account : Account()
    SubSection (status == "GOOD") from $account.getSubSections()
then
    insertLogical(new AccountIsGood($account));
end
Run Code Online (Sandbox Code Playgroud)

AccountIsGood($account)如果至少有一个部分是好的,我希望这只是添加逻辑规则.但是,似乎这不仅仅检查一个成功的子部分并结束规则,而是继续检查所有子部分并为每个有效子部分插入逻辑规则.例如,如果一个帐户有四个有效的小节,我会获得该帐户的四个规则副本.

所以我的问题是,是否有办法重写此规则以获得所需的行为?

帐户类:

public class Account {
  private List<SubSection> subsections;

  // Getters / Setters/ other code
}
Run Code Online (Sandbox Code Playgroud)

lau*_*une 5

保持规则尽可能简单.虽然检查插入是否存在是可行的AccoundIsGood(),但建议编写逻辑,以便仅测试单个良好子部分的存在.此外,您需要from从Account对象中提取子节.

rule testForGood
when
  $account: Account( $sub: subsections )
  exists SubSection( status == "GOOD" ) from $sub
then
  insertLogical( new AccountIsGood($account) );
end
Run Code Online (Sandbox Code Playgroud)

insertLogical如果分段状态可能会改变远离"GOOD",那么保留一个好主意:如果accound没有至少一个GOOD部分,则逻辑插入的事实将被撤回.