2017-01-19 9 views
0

私は複数のルールが一致していて、最も低いSalienceでルールを取得しています。 これはソースファイルです。Droolが最低特権ルールを返す

package HotelAnalyticsLuxuryPromotions 
#generated from Decision Table 
import com.mmt.analytics.hotel.promotions.drools.HotelPromotionsDroolsPojo; 
import com.mmt.analytics.hotel.promotions.drools.HotelPromotionsDroolRules; 
#From row number: 11 
rule "for Luxury Hotel Promotions_11" 
    salience 9 
    when 
     fact: HotelPromotionsDroolsPojo(
    eval(HotelPromotionsDroolRules.checkHotelId(fact,"12345")), 
    eval(HotelPromotionsDroolRules.checkRsq(fact,"*")), 
    eval(HotelPromotionsDroolRules.checkValidCheckInCheckOut(fact,"*")), 
    eval(HotelPromotionsDroolRules.checkLoggedStatus(fact,"*"))) 
     eval(HotelPromotionsDroolRules.checkActiveStatus(fact,"1")) 
    then 
     fact.setPackageName("Pack 2"); 
     fact.setRatePlanCode("ABC 2"); 
     fact.setTariffUrl("TariffUrl"); 
     fact.setClickUrl("ClickUrl"); 
     fact.setInclusionText("InclusionText"); 
end 

#From row number: 12 
rule "for Luxury Hotel Promotions_12" 
    salience 10 
    when 
     fact: HotelPromotionsDroolsPojo(
    eval(HotelPromotionsDroolRules.checkHotelId(fact,"12345")), 
    eval(HotelPromotionsDroolRules.checkRsq(fact,"*")), 
    eval(HotelPromotionsDroolRules.checkValidCheckInCheckOut(fact,"*")), 
    eval(HotelPromotionsDroolRules.checkLoggedStatus(fact,"*"))) 
     eval(HotelPromotionsDroolRules.checkActiveStatus(fact,"1")) 
    then 
     fact.setPackageName("Pack 1"); 
     fact.setRatePlanCode("ABC 1"); 
     fact.setTariffUrl("TariffUrl"); 
     fact.setClickUrl("ClickUrl"); 
     fact.setInclusionText("InclusionText"); 
end 

#From row number: 14 
rule "for Luxury Hotel Promotions_14" 
    salience 5 
    when 
     fact:HotelPromotionsDroolsPojo(
    eval(HotelPromotionsDroolRules.checkHotelId(fact,"12345")), 
    eval(HotelPromotionsDroolRules.checkRsq(fact,"*")), 
    eval(HotelPromotionsDroolRules.checkValidCheckInCheckOut(fact,"*")), 
    eval(HotelPromotionsDroolRules.checkLoggedStatus(fact,"*"))) 
     eval(HotelPromotionsDroolRules.checkActiveStatus(fact,"1")) 
    then 
     fact.setPackageName("Pack 3"); 
     fact.setRatePlanCode("ABC 3"); 
     fact.setTariffUrl("TariffUrl"); 
     fact.setClickUrl("ClickUrl"); 
     fact.setInclusionText("InclusionText"); 
end 

最高の優先度を持つルールを返さなければならないと思いますが、その逆があります。以下は

は、ルールエンジンのコードです

StatelessKnowledgeSession kSession = promotionsDroolManager.getStatelessSession(); 
     kSession.execute(droolsPojo); 

私はこれらのよだれ構成プロパティーに

promotions.drools.agent.scan.resources=true 
promotions.drools.agent.scan.directories=true 
promotions.drools.resource.scanner.interval=1800 
promotions.drools.agent.monitor.change.set.events=true 
promotions.drools.knowledge.agent.name=Promotions_Knowledge_agent 
promotions.drools.base.knowledge.agent.change.set.path=promotions.xml 

Plsのを使用しています。提案

答えて

1

あなたは同じ左手側(条件)の3つのルールを持っています。一致するものがあれば、すべて一致します。もし誰かが発砲すれば、彼らはすべて発砲する。それらはあなたが顕著性を使って制御する順序で発射する。

右辺(結果)は非常に似ていますが、同じセッターの値は異なります。それらがすべて起動すると、セッターの最後のグループの値は、一致した事実に現れるようになります。

これは、最も顕著なルールのセッターのグループです。

を編集する1.上記以外の理由:条件は同じですか?それは意味をなさない。 2.エステバンの提案はオプションです。 3.複数のルールを起動しない場合は、fireAllRules(1)を呼び出します。 4.フィールドの1つ(例:packageName)がまだnullであることをテストする制約を追加します。

when 
    fact:HotelPromotionsDroolsPojo(packageName == null, 
    ... 
then 
    fact.setPackageName("..."); 
    ... 
    update(fact); 
+0

おかげさまで、Laune氏に感謝します。あなたは同じ左翼であれば教えてくれますか?どのようにしてHighest Salienceルールを得ることができますか? –

+0

いくつかのアイデアを追加しました。 – laune

1

モデルルールにkie workbenchを使用している場合は、下に示すような顕著性属性の列を追加することができます。これにより、テーブルの最後のルールが最も優先されるようになります。

salience column

1

ラウンに述べたように、顕著性は、ルールの結果が実行される順序を決定します。 あなたの場合、すべてのルールのLHS(左側)が同じであれば、1つのルールがアクティブ化されている場合、それらのルールはすべて有効です。次に、Droolsは各規則の顕著性によって与えられた順序でこれらの規則のRHSを実行します。より顕著なルールが最初に実行されます。それが、より低い顕著性を持つルールだけが実行されているように見える理由です。このルールは基本的に他の2つのルールが行ったことを上書きします。

あなたの場合、必要なのはルールのactivation-group属性を設定することです。 Drools documentation

この属性の文字列値で識別される同じアクティベーショングループに属するルールは、排他的に発火します。より正確には、発動する発動グループの最初のルールは、グループ内のすべてのルールの保留中のすべての発動を取り消します。発火を停止します。

したがって、すべての排他ルールを同じactivation-groupに設定してください。最初のアクティブ化(最も顕著なもの)が実行されると、他のアクティベーションはキャンセルされます。

希望します。

関連する問題