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 が Out of Memory エラーで停止し始めることです。
これらの Drools ルールのブール論理「グループ化」を処理する最良の方法は何ですか? ありがとう!