0

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

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

请。建议

4

3 回答 3

1

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

显着柱

于 2017-01-20T08:04:17.200 回答
1

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

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

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

所以,把你所有的“排他”规则放在同一个activation-group地方,这样当第一个激活(具有最高显着性)被执行时,其他激活将被取消。

希望能帮助到你,

于 2017-01-20T08:08:28.537 回答
1

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

右侧(结果)非常相似,相同设置器中的值不同。如果它们都触发了,最后一组 setter 中的值必然会出现在匹配的事实中。

这是规则中显着性最低的一组二传手。

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

when
   fact:HotelPromotionsDroolsPojo(packageName == null,
   ...
then
    fact.setPackageName("...");
    ...
    update( fact );
于 2017-01-20T00:13:10.613 回答