3

Drools ルールとして記述しているいくつかのドメイン ルール (「前提条件」と呼びます) があります。たとえば、生徒が と見なされるためHasGoodGradesには、GPA > 3.0 を維持する必要があります。また、これらの前提条件を基本的にブール論理でグループ化したルールもあります。たとえば、IsInHonorRoll. 真であるためIsInHonorRollには、ルールHasGoodGradesを満たす必要があります、OR ( HasOkGradesAND 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 ルールのブール論理「グループ化」を処理する最良の方法は何ですか? ありがとう!

4

2 に答える 2