Drools如何从一个大规则派生出较小的可读规则

时间:2017-03-29 19:51:57

标签: drools

我的规则使用的事实是聚合其他对象。我想解决的问题是最小值和最大值链。找到具有最高平均iq和最低年龄的人群(这些是事实)和...以及和......各种其他标准。

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

我怎样才能做得更好?

规则"找到平均iq最高且平均年龄最低的组#34; 当

$options: PeopleGroup(

        $averageIq : getAverageIg(this),

        $averagAge : getAverageAge(this),

)

not (   PeopleGroup(getAverageIg(this) > $averageIq )

        or PeopleGroup(getAverageIg(this) == $averageIq, getAverageAge(this) < $averagAge  )

然后

//将PeopletGroup添加到结果

端。

由于

1 个答案:

答案 0 :(得分:0)

您对问题的描述过于模糊,但无论如何我都会讨论您的几个选项。

首先,如果您正在寻找&#34;最好的团体&#34;您应该定义方法PeopleGroup.compareTo( PeopleGroup pg ),以便PeopleGroup实现Comparable<PeopleGroup>。找到最佳组的规则应该很简单。 (当然,您可以选择编写任意数量的静态方法,比较两个PeopleGroup对象,以获得您可能想到的任何排名。)无论如何,规则将非常简单。

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

另一种方法是通过收回不合格的事实或通过标记它们来过滤事实。因此,在第一遍中,您将收回没有最大IQ的任何组。接下来,您取消任何没有最低年龄的剩余群体的资格。您需要使用议程组或突出或控制订单的其他逻辑来订购规则。但个别规则很简单。