Drools:在规则

时间:2015-08-12 00:57:07

标签: drools

是否可以测试一组规则的条件是否重叠?我当前问题的简化版本是,如果我有一组测试Person.age的规则,是否可以保证/验证/测试LHS仅对最多一条规则有效?

例如,这两个规则是“有效的”:

rule "r1"
when
  Person( age > 0 && age < 18 )
then
  // do something
end

rule "r2"
when
  Person( age >= 18 && age < 65 )
then
 // do something else
end

但以下不是:

rule "r1"
when
  Person( age > 0 && age < 10 )
then
  // do something
end

rule "r2"
when
  Person( age >= 8 && age < 16 )  // range overlaps with r1!
then
 // do something else
end

我知道我可以使用halt()来防止多个规则被触发,我正在寻找方法来防止或至少警告多个规则被触发的可能性。

2 个答案:

答案 0 :(得分:2)

这样的重叠不一定是规则中的错误,因此您必须编写自己的一些代码,根据您的设置检查错误。

“稳定API”不提供访问编译规则以检索约束的方法。您必须使用一些内部API类。编写这些代码并进行测试(!)可能比为您的规则开发可靠的测试更加努力 - 无论如何您都必须这样做。

警告可以通过事件监听器以直接的方式对一组规则中的多个规则进行警告。

答案 1 :(得分:1)

我无法想象有一种流涎的方式可以自动检测&#34;如果存在规则重叠,那么就像laune在他的回答中所说,你必须提出自己的测试用例等,并使用事件监听器来提醒多个规则。

为了防止第二个/第三个/ etc规则被触发,您可以插入在所有规则之间共享的控制事实(类似于例如https://ilesteban.wordpress.com/2012/11/16/about-drools-and-infinite-execution-loops/) 但他们将成为你规则条件的一部分。 因此,您最终会添加类似

的条件
not RuleHasFiredControlFact

到你的LHS和

之类的东西
insert(new RuleHasFiredControlFact())  

到您的RHS(伪代码,未完成)