在Drools执行KIE

时间:2018-01-23 09:37:52

标签: java jboss drools kie

我有一套规则,根据对象的对象数量

,它们的行为会有所不同

我希望为每个传递的Product类对象执行2条规则。

  1. 当我传递产品2的单个对象时,执行规则(很好)

    Product product5= new Product();
        product5.setType("gold");
        product5.setBuyer("platinum");
        product5.setEvent("sale");
        product5.setName("product5");              
        ksession.insert(product5);
    
  2. 当我传递Product类的两个对象时,执行的规则数是6(我无法理解)。

    Product product5= new Product();
    Product product3= new Product();
    //setting all fields in both objects
    ksession.insert(product5);
    ksession.insert(product3);
    

    我试图通过添加控制台打印来调试这个,这是我的结果

    为每个对象执行一次Gold(预期)。

    每个对象执行两次节日金奖(应该是两次)。

    未调用钻石(预期)

  3. 当我传递Product类的三个对象时,执行的规则数是12(我无法理解)。 我尝试通过添加控制台打印来调试这个,这是我的结果

    为每个对象执行一次Gold(预期)。

    每个对象执行三次节日金奖(应该是两个)。

    未调用钻石(预期)

  4. 以下是我的DRL文件

        rule "Offer for Diamond"
        when
        $productObject: Product(type == "diamond")
        then
        $productObject.setDiscount(15);
        end
    
    
        rule "Offer for Gold"
        salience 1
    
        when
        $productObject: Product(type == "gold")
        then
        $productObject.setDiscount(25);
        end
    
    
        rule "Offer for Gold on Festival"
        when
        $productObject: Product(type == "gold") && Product(event == "sale")
        then
        $productObject.setDiscount($productObject.getDiscount() + 5);
        end
    

1 个答案:

答案 0 :(得分:1)

假设您的2个对象具有相同的属性,这些是执行的规则(和事实):

  • “钻石报价”:0次
  • “Gold for offer”:2次:
    • O1
    • O2
  • “节日金奖”:4次
    • o1,o1
    • o1,o2
    • o2,o1
    • o2,o2

正如您所看到的,当您在模式之间使用&& 时,您正在创建所有可能组合的笛卡尔积。

在“节日金奖”中,如果您希望每个对象执行一次规则,那么您必须明确告诉Drools这2个模式正在讨论同一个对象:

rule "Offer for Gold on Festival"
when
    $productObject: Product(type == "gold") && 
    Product(this == $productObject, event == "sale")
then
    $productObject.setDiscount($productObject.getDiscount() + 5);
end

现在,如果您的规则与上面的规则完全相同,只需执行以下操作即可简化:

rule "Offer for Gold on Festival"
when
    $productObject: Product(type == "gold", event == "sale")
then
    $productObject.setDiscount($productObject.getDiscount() + 5);
end

在这种情况下,由于您没有2个模式,因此每个Product仅对该规则进行一次评估。

希望它有所帮助,