リファレンス salience
ルールを複数定義上記すると同じ条件でマッチするときがあります。デフォルトはLIFO方式なのでルール定義を下に宣言したものからマッチングされます。
たとえば
rule "rule-1" when Person() then System.out.println("rule-1"); end rule "rule-2" when Person() then System.out.println("rule-2"); end
としてPersonオブジェクトをインスタンス化してDroolsに渡して実行するとrule-2->rule-1の順でコンソール出力されます。そこで優先順位を持たせたいと
きには「salience」を宣言します。値を添えて宣言して、その値が大きいほど優先順位も高くなります。
rule "rule-1" salience 2 when Person() then System.out.println("rule-1"); end rule "rule-2" salience 1 when Person() then System.out.println("rule-2"); end
これで実行するとrule-1->rule-2の順で出力されます。こういう風に固定値でsalienceも宣言できますが、動的にすることも可能です。たとえば
import com.sample.Person; rule "padawan" salience 30 #平均年齢 when $p : Person() then System.out.println("まだまだひよっこだなぁ"); retract($p); end rule "jedi" salience ($p.age * 2) when $p : Person() then System.out.println("もう立派なJEDIや"); retract($p); end
とルールを書いてPersonオブジェクトのageが10才だと「まだまだひよっこだなぁ」が出力されます。20才だと、jediルールのsalienceの値が40になるのでこっちを先にマッチングするようになるので「もう立派なJEDIや」と出力されます。複雑な計算と重みづけを簡単に宣言できる、といったところですかね。あ、retractはルールエンジンから対象オブジェクト(ファクト)を取り除くこと(つまりルールマッチングでもう使わない)を意味しています。