口水回归最低显着性规则

时间:2017-01-19 21:15:11

标签: java drools drools-guvnor guvnor

我遇到了多个规则匹配的问题,并且获得了具有最低显着性的规则。 这是源文件。

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);

我正在使用这些Drool配置属性

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。建议

3 个答案:

答案 0 :(得分:1)

您有三条相同左侧(条件)的规则。如果匹配,他们都匹配。如果一个人开火,他们都会开火。他们按照你使用显着性控制的命令开火。

右侧(后果)非常相似,相同制定者的价值不同。如果它们全部触发,则最后一组setter中的值必然会出现在匹配的事实中。

这是规则中具有最低显着性的制定者组。

编辑 1.最重要的是:为什么条件相同?它没有意义。 埃斯特万的提案是一种选择。 3.如果您不想触发多个规则,请调用fireAllRules(1)。 4.添加约束测试,其中一个字段(例如packageName)仍为空。您需要调用修改或更新:

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

答案 1 :(得分:1)

如果您使用kie workbench进行建模规则,则可以添加salience属性列,如下所示。这将确保表中的最后一条规则具有最高优先级。

salience column

答案 2 :(得分:1)

正如Laune所说,显着性只决定了规则执行后果的顺序。 在您的情况下,假设所有规则的LHS(左侧)相同,当激活1个规则时,所有规则都是。然后,Drools将按照每个规则的突出性给出的顺序执行这些规则的RHS。具有较高显着性的规则将首先执行。这就是为什么你看到具有较低显着性的规则是唯一被执行的规则。这条规则基本上覆盖了其他两条规则所做的事情。

在您的情况下,我会说您需要设置规则的activation-group属性。来自Drools documentation

  

属于同一激活组的规则(由此属性的字符串值标识)将仅以独占方式触发。更准确地说,激活组中的第一个规则将取消组中所有规则的所有待激活,即阻止它们被触发。

所以,把你所有的'排他性的'同一activation-group中的规则,因此当执行第一次激活(具有最高显着性)时,其他激活将被取消。

希望它有所帮助,