我有几个域规则(我将它们称为“先决条件”),我将它们描述为 Drools 规则。例如,对于被视为 的学生HasGoodGrades
,他们必须保持 GPA > 3.0。我还有一些规则,这些规则基本上是这些先决条件的布尔逻辑分组——例如IsInHonorRoll
. 要IsInHonorRoll
为真,HasGoodGrades
需要满足规则,OR ( HasOkGrades
AND HasPerfectAttendance
)。
我的处理方式是PreconditionResult
在满足规则时插入事实。然后,在这些更大的“分组”规则中,我正在检查这些PreconditionResult
事实并在那里执行布尔逻辑:
rule "IsInHonorRoll"
dialect "mvel"
when
$s : Student()
PreconditionResult( id == "HasGoodGrades", student == $s)
or
( PreconditionResult( id == "HasOkGrades", student == $s)
and
PreconditionResult( id == "HasPerfectAttendance", student == $s) )
then
System.out.print("Student is in the Honor Roll.");
end
rule "HasOkGrades"
dialect "mvel"
when
$s : Student( gpa > 2.0 )
then
insert(new PreconditionResult("HasOkGrades", $s))
end
rule "HasGoodGrades"
dialect "mvel"
when
$s : Student( gpa < 3.0 )
then
insert(new PreconditionResult("HasGoodGrades", $s))
end
rule "HasPerfectAttendance"
dialect "mvel"
when
$s : Student( daysAbsent == 0 )
then
insert(new PreconditionResult("HasPerfectAttendance", $s))
end
这似乎可行,但感觉不自然,我相信在 Drools 中有更好的方法来做这种事情。更重要的是,如果有足够多的这些规则和足够大且足够复杂的布尔子句,Drools 就会开始因内存不足错误而死亡,即使堆大小非常大。
处理 Drools 规则的这些布尔逻辑“分组”的最佳方法是什么?谢谢!