2016-05-12 7 views
0

私は状況があり、私は動的にルールを追加する必要があります。その単純なルールの場合、同じ文字列を作成してknowledgebaseに追加することもできますが、ルールの一部としてリストを含める必要がある状況があります。このリストも動的に作成されます。ルールを追加してリストを追加すると、異なるイベントとして発生します。実行時に作成されたdroolsのリストへのアクセス

私はを持っていたと思っていましたが、ここでkeyはリストの名前です。ハッシュマップにアクセスし、リスト名を使用してリストを取得し、droolsの基準としてwhenを使用します。

$pojo:Pojo($listOfString : list1, $listOfString contains input) 

ルールをdroolsに追加している間。

私が知る限り、fireRuleのように、pojoのリストの一般的な名前を持っていても、droolsは使用するリストを選択する際に完全に混乱します。ルールを実行すると、ルールごとに同じリストが使用され、結果は期待どおりになりません。

それ以外の方法がある場合は、教えてください。

私はあなたがリストの識別と要素の値を含むクエリ事実を挿入することにより、リストの1の要素のためのクエリを起動することができDroolsの5.1

+0

すべてのファクトは、実行時に作成され、WMに挿入されるため、リストが珍しいことはありません。そのMapを持っている場合は、eval CEにJavaコードを書き込んで、そのキーでListを抽出し、Stringの存在をテストできます。 Pojoパターンのサンプルコードでは、マップがあることを示していません。 – laune

+0

@laune私はこの事実に同意しますが、問題は私が1つのルールを起動するのではなく、代わりに一連のルールを必要とし、それぞれ異なるリストを必要とし、それに対して文字列を評価する必要があります。したがって、実行時に事実を記入しても、ハッシュマップを渡して必要なリストを差し引いて入力を評価する方法がわかっている場合、ハッシュマップではなく、ただ1つのリストだけを入力できます(これまでのことです)。それは私に教えてください。 – piyushj

答えて

0

を使用しています。 evalは5.1.1、IIRCで動作するはずです。あなたはNPEを避けるために鍵xのリストがないことを守る必要があるでしょう。

rule "is element y in list with key x" 
when 
    Query($x: key, $y: element) 
    Pojo($map: map) 
    eval($map.get($x).contains($y)) 
then 
    ... 
end 
+0

この例では 'Query'は何ですか、それはdroolsのキーワードですか?私はこれを使用しようとするとエラーが発生しました 'ObjectType' Query''を解決できません – piyushj

+0

もちろん未定義です。これはJavaクラスとして宣言され、キーと期待値でインスタンス化され、WMに挿入されます。 – laune

0

最後に、少し違うルールの設定でも同じことを達成できましたが、正しい方法を示すために@launeのおかげです。ルールは以下のように書くことができる

rule "is element value in list with key key1" 
when 
    pojo: Pojo($map:map) 
    entry: Entry() from $map.entrySet() 
    value : String() from entry.getValue() 
    key1 : String() from entry.getKey() 
    Boolean(booleanValue == true) from (value == pojo.input && key1 == pojo.key) 
then 
    ........ 
end 

ここinputたちは、リスト内で検索したい要素であり、そしてkey1は、入力が検索されなければならない中で、リストの名前です。

EDIT

pojo.key文句を言わないルールを作成するときにのみ、変数が文字列リストが評価する必要があり、それに対して(pojo.valueを)となりますので、リスト名はすでに、設定されるように、使用すること。

+0

これは私が投稿したものの非常に膨らんだ変形です。 - Pojoにフィールドのキーと入力を追加しました。これは、トランザクションデータを不揮発性のルックアップデータを含むオブジェクトに格納するため、おそらく良い考えではありません。"from"を使わずにオブジェクトのフィールドにアクセスすることができます。そして、ブール値(booleanValue)は、eval CEを書くことの爆発的な変形です。 – laune

+0

@launeルールをパースする際にルールを動的に作成する際に、キーを追加してpojoに入力しました。ルールを解析する際にエラーが発生します。これを避ける方法はありますか?(クエリは、しかし、私は本当にそれについてはうんざりです:()そしてevalについてどこかに私はあなたができる限り避けるべきであることをお読みください – piyushj

+0

私はルールのテキストもエラーも知らないので "エラーを投げる"ことはできませんDRLコンパイラによって報告された - evalを避けることは、事実フィールドに通常の方法でアクセスする制約を書くことによって回避することができれば良いです。 .key) "は評価と同じくらい悪いです。 – laune

関連する問題