リファレンス exists
これはワーキングメモリに存在しているか、ということなんだけど正確には「ひとつでもあるか」となります。まずは豚もおだてりゃ木に登るのシンプルな例。
rule "climbtree" when $person : Person(action == 'おだてる') exists Tree() $pig : Pig() then $pig.climb(); end
となります。
exists Tree()は今までやってきたようにTree()の単純に記述するのと何が違うのかというと「ひとつでもあるか」ってところです。下のJavaの例だと
public class Pig { /** 登る */ public void climb() { System.out.println("登ったどー"); } }
と
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Tree tree = new Tree(5); ksession.insert(tree); Tree tree2 = new Tree(10); ksession.insert(tree2); ksession.fireAllRules();
として実行したとします。木(Tree)を2本置きました。existsを用いるとマッチングは1回、Tree()だけだと2回マッチングします。これはつまり、ワーキングメモリ上ではオブジェクトはIdentityで認識しているということです。これはデフォルトの挙動です、中身としてはIdentityHashMapに保存されます。weakReferenceじゃないんだね、そっか〜。。。ちなみに、この挙動はEqualityに変えられる。昔のAPIではマニュアルにかいてあったんだけど5.0用が見当たらない。sourceみた限りも見つからんかった。昔のままなのか。あとで調べる。
<追記>
KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
と宣言して
config.setOption( AssertBehaviorOption.EQUALITY );
か
config.setProperty( AssertBehaviorOption.PROPERTY_NAME, "equality" );
でおk!!でした。