Drools:针对同一案例触发两次规则

Drools: Rule firing twice for the same case

虽然只有一个匹配案例,但此规则会触发两次。我使用 Drools 6.5.0。最后。看log,第二轮取$card2为$card1,反之亦然

rule "Rule1"
salience 1
when
  $card1 : (used == false)
  $card2 : (used == false, number = $card1.number)
  exists Hand(name == name1)
  exists Hand(name == name2 || name == name3)
  not Hand(name == name4)

then
    $card1.setUsed(true); $card2.setUsed(true);
    insert(new Hand(name1, $card1, $card2));

end

首先,我觉得你的规则格式不正确。前 2 个模式缺少它们的类型,并且存在并非来自任何地方的变量(即 name1)。

其次,请记住 Drools 中规则的 LHS 有点像 SQL 语句。如果您未指定模式之间的任何关系,将使用它们的笛卡尔积。

希望对您有所帮助

规则的 No-Loop 属性确保当在 then 语句中更新/修改 when 条件中使用的相同对象时,不会重新触发相同的规则。

定义无循环的方式如下:

rule "Rule1"
no-loop true