Drools如何从大规则中派生出可读性较小的规则

Drools如何从大规则中派生出可读性较小的规则,drools,Drools,我的规则使用的事实是聚合其他对象。我想解决的问题是一系列的最小值和最大值。找出平均智商最高、年龄最低的人群(这些都是事实)以及其他各种标准 看看下面的规则,如果我有2-3个这样的标准,LHS将变得不可读 我怎样才能做得更好 规则“找到平均智商最高、平均年龄最低的群体” 什么时候 $options:PeopleGroup( $averageIq:getAverageIg(此), $Average:GetAverage(此), ) 不是(PeopleGroup(getAverageIg(this)>

我的规则使用的事实是聚合其他对象。我想解决的问题是一系列的最小值和最大值。找出平均智商最高、年龄最低的人群(这些都是事实)以及其他各种标准

看看下面的规则,如果我有2-3个这样的标准,LHS将变得不可读

我怎样才能做得更好

规则“找到平均智商最高、平均年龄最低的群体” 什么时候

$options:PeopleGroup(
$averageIq:getAverageIg(此),
$Average:GetAverage(此),
)
不是(PeopleGroup(getAverageIg(this)>$averageIq)
或PeopleGroup(getAverageIg(此)=$averageIq,getAverageAge(此)<$Average)
)

然后

//将PeopletGroup添加到结果中

结束


谢谢

对您的问题的描述太模糊了,但我将讨论您的一些选择

首先,如果您正在寻找“最佳组”,您应该定义一个方法
PeopleGroup.compareTo(PeopleGroup pg)
,以便
PeopleGroup
实现
Comparable
。寻找最佳组的规则应该很简单。(当然,您可以选择编写任意数量的静态方法来比较两个PeopleGroup对象,以获得您可能想到的任何类型的排名。)在任何情况下,规则都非常简单

rule "best group"
when
    $pg1: PeopleGroup()
    not PeopleGroup( this.compareTo( $pg1 ) > 0 )
then
    // $pg1 is best PeopleGroup
end

另一种方法是过滤事实,要么收回不合格的事实,要么对其进行标记。因此,在第一步中,你收回任何没有最高智商的小组。接下来,您将取消任何剩余的没有最低年龄的组的资格。您需要使用议程组、显著性或其他逻辑来控制规则的顺序。但个别规则将很简单

首先,感谢您的回复!虽然我理解第二种方法,但我并没有真正理解第一种方法。根据上面的示例,上面的规则,使用第一种方法时规则会是什么样子?添加了规则,因为它可以用compareTo编写。
rule "best group"
when
    $pg1: PeopleGroup()
    not PeopleGroup( this.compareTo( $pg1 ) > 0 )
then
    // $pg1 is best PeopleGroup
end