Java Drool回归最低显著性规则

Java Drool回归最低显著性规则,java,drools,drools-guvnor,guvnor,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.HotelPromotionsDroolR

我遇到了多个规则匹配的问题,得到了显著性最低的规则。 这是源文件

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

请。建议

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

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

这是规则中显著性最低的设定者组

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

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

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

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

这是规则中显著性最低的设定者组

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

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

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


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


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

在您的情况下,我想说您需要设置规则的
激活组
属性。发件人:

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

因此,将所有“独占”规则放在相同的
激活组中
,以便在执行第一次激活(具有最高显著性)时,其他激活将被取消


希望能有所帮助,

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

在您的情况下,我想说您需要设置规则的
激活组
属性。发件人:

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

因此,将所有“独占”规则放在相同的
激活组中
,以便在执行第一次激活(具有最高显著性)时,其他激活将被取消


希望能有所帮助,

谢谢劳恩提供的信息。你能告诉我,如果是同一个左边;我如何才能得到最高的显著性规则作为回报。添加了一些想法。感谢Laune提供的信息。你能告诉我,如果是同一个左边;我怎样才能得到最高的显著性规则作为回报。补充了一些想法。