当前位置: 首页 > 知识库问答 >
问题:

如何对多个对象使用drools特性

翟冯浩
2023-03-14

如果我向Drools引擎添加一个事实,我有一组正确工作的Drools规则,如果我添加两个事实,这些规则只应用于第一个事实。如何使规则集适用于多个事实?

我的可追踪事实:

@Traitable
public class Policy {

    private String postalCode;
    private String houseHold;
    private BigDecimal grossPremium;

    public Policy(String postalCode, String houseHold) {
        this.postalCode = postalCode;
        this.houseHold = houseHold;
    }
}

我的规则集:

import java.math.BigDecimal;

declare trait PolicyWithFactors
    policy : Policy
    postalCodeFactor : Double
    houseHoldFactor : Double
end

rule rule1
when
    $f : PolicyWithFactors(policy.postalCode == "1000", postalCodeFactor == null)
then
    System.out.println("Running rule1 for " + $f.getPolicy().getHouseHold() + " and " + $f.getPolicy().getPostalCode());
    modify($f) { setPostalCodeFactor(20.0); }
end

rule rule2
when
    $p : Policy()
    not PolicyWithFactors()
then
    System.out.println("Running rule2 for " + $p.getHouseHold() + " and " + $p.getPostalCode());
    PolicyWithFactors $pwf = don($p, PolicyWithFactors.class);
    modify ($pwf) { setPolicy($p); }
end

rule rule3
when
    $p : Policy(houseHold == "single")
    $f : PolicyWithFactors(houseHoldFactor == null)
then
    System.out.println("Running rule3 for " + $p.getHouseHold() + " and " + $p.getPostalCode());
    modify($f) { setHouseHoldFactor(10.0); }
end

rule rule4
when
    $p : Policy(grossPremium == null)
    $f : PolicyWithFactors(policy == $p, $pcf : postalCodeFactor != null, $hhf : houseHoldFactor != null)
then
    System.out.println("Running rule4 for " + $pcf + " and " + $hhf);
    BigDecimal $gp = new BigDecimal($pcf * $hhf);
    modify($p) { setGrossPremium($gp); }
end

rule rule5
when
    $p : Policy(houseHold == "family")
    $f : PolicyWithFactors(houseHoldFactor == null)
then
    System.out.println("Running rule5 for " + $p.getHouseHold() + " and " + $p.getPostalCode());
    modify($f) { setHouseHoldFactor(15.0); }
end

失败的测试用例:

public class RuleTest {

    @Test
    public void test() {
        KieServices kieServices = KieServices.Factory.get();
        KieContainer kieContainer = kieServices.getKieClasspathContainer();
        KieSession kieSession = kieContainer.newKieSession();
        Policy policy1 = new Policy("1000", "single");
        kieSession.insert(policy1);
        Policy policy2 = new Policy("1000", "family");
        kieSession.insert(policy2);
        kieSession.fireAllRules(50);
        assertThat(policy1.getGrossPremium(), is(new BigDecimal("200")));
        assertThat(policy2.getGrossPremium(), is(new BigDecimal("300")));
    }
}

共有1个答案

岳泉
2023-03-14

罪魁祸首是rule2。它不会在工作内存中一旦有一个PolicessFactors就触发。

rule rule2
when
  $p : Policy()
  not PolicyWithFactors( policy == $p)
then ... end

我还没有尝试理解其余的所有内容,但请检查是否应该在所有后续规则中都存在此约束,以便将一个策略与一个PolicyWithFactors匹配。

 类似资料:
  • 问题内容: 我试图编组多个对象,例如添加到via中。我开始使用此设置: 和 但是,我得到了以下运行时例外: javax.xml.bind.JAXBException:com.jaxb.example.marshall.Book或其任何超类对此上下文都是未知的] 我的类型定义如下。 书:- 图书清单:- 马歇尔代码:- 我正在尝试放置注释(参考:-JAXB异常:该上下文未知的类)。该注释在我的版本中

  • 另外,我不明白当我们只调用bind()而不调用sync()时会发生什么。服务器是否以某种方式继续运行?我们如何优雅地关闭它? 很明显,我对这一切的工作原理感到非常困惑,可悲的是,在这方面缺乏完整的文档。任何帮助都将不胜感激。

  • 问题内容: 我是Nodejs的新手。如何导出多个对象?例如 我想使用类似的模型: 我想使用类似这样的对象: 谢谢你的建议:D 更新 :解决以下方法: 但是我还有另一个问题。如何动态分配模型? 更新通过 以下方式解决了第二个问题: 问题答案: 只需将它们包装在对象文字中即可。在纯JS(没有CoffeeScript)中,将是: 在coffeescript中,您使用缩进,但要创建空对象时除外:

  • 我编写了以下代码和驱动程序,但我不知道如何使用两个构造函数创建银行账户对象。一个构造函数获取初始余额,第二个构造函数在没有钱的情况下开设账户。此外,Account tBalance是否应该包括有效性检查? 或者,我可以执行以下操作: 将费用作为描述银行账户的一部分。根据需要更新BankAccount类。用户应该能够为每个帐户设置费用金额,并通过一种方法添加费用。向驱动程序添加代码以演示费用功能。(

  • 我试图在OpenGL中使用多个VAO和VBO渲染多个对象。使用相同的顶点渲染多个对象我已经做过了,但是我想做的是为每个对象使用不同的顶点,例如画一个正方形和一个圆形。对于一个正方形,我只需要6个顶点,但是对于圆,我需要360个顶点。我有阅读或创建着色器的错误。 以下是顶点着色器: 片段着色器: VAO和VBO的生成与绑定 以及渲染循环中的绘制调用: 我重复一遍,用我做过的相同顶点绘制多个对象。我需

  • 我有一个程序,它有一个超级类,个人和子类,学生,并试图根据他们的生日和名字来比较他们什么时候是平等的。我做对了,但是在我试图解决的提示下,我得到了一个错误,自动评分器是:“测试学生和学生是一样的,即使成绩不同”,预期结果是真的,但我总是得到错误。这个程序在比较人和学生时起作用,在比较人和人时起作用,而不是学生和学生,我不知道为什么。 主要类别: 超类: 子类: