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

drools中的单个继承

冯亮
2023-03-14

我们使用的是drools 7.31版本。我们有一个大规则,必须在其他规则中重复使用。我们需要的基本功能是在超级规则和子规则条件都为真时激发超级规则。似乎旧版本有“extends”关键字,这是可能的。我在看一个更老的帖子,它可以做到这一点-

drools规则继承

rule "super"
    @description("Generic super rule")
    when 
        $person : Person()
        a : PersonInput() from $person.getInput()
        if (a.getPersonId() == 1) break[pvd1]
        else if (a.getPersonId() == 2) break[pvd2]
    then System.out.println("Default then = " + a.getPersonId());
    then[pvd1] System.out.println("Super RULE has person id = " + a.getPersonId());
    then[pvd2] System.out.println("Super RULE has person id = " + a.getPersonId());
end

rule "sub" extends "super"
    @description("Sub rule")
    when
        c : PersonInput(HouseholdId == "99999") from $person.getInput()
    then
        System.out.println("Sub RULE has HouseholdId == 99999 == " + c.getPersonId());
end

我期望的输出只是打印HouseHoldid99999的personId 1/2。

谢了。

共有1个答案

公良照
2023-03-14

Drools7.31仍然支持“扩展”机制。这里的问题是,当您扩展一个基本规则时,基本规则确实会触发。(这一点很明显;如果基规则无效,则子规则无效。如果基规则有效,则它激发。当子规则激发时,它也激发父规则。)

解决这个问题的传统方法是使用三个规则。“base”规则应该没有任何后果(也就是说,没有右手边/then子句),所以它只是列出了常见的条件。然后,“super”规则的结果是扩展基本规则的规则,没有任何附加的“when”条件,并且像往常一样有Then子句。而“子”规则也延伸了“基”,包括其附加条件,然后是其自身的后果。如果您不希望“super”在“sub”触发时触发,您可以让它们相互排斥。

下面是一个有意简化的示例:

rule "Base Rule"
when
  $person: Person( $input: input != null )
  PersonInput( $id: personId in (1, 2) )
then
// intentionally no 'then' clauses
end

rule "Super" extends "Base Rule"
when
  // No additional conditions, just use whatever is in Base Rule
then
  System.out.println("Person has id: " + $id);
end

rule "Sub" extends "Base Rule"
when
  PersonInput( householdId == "99999") from $input
then
  System.out.println("Household ID is 99999; id: " + $id);
end
rule "Super" extends "Base Rule"
when
  // This is the condition from Sub, inverted:
  PersonInput( householdId != "99999" ) from $input
then
  System.out.println("Person has id: " + $id);
end

我所展示的“没有后果”的基本规则模式就是从这个现实中演化出来的。按照这种模式,“基本规则”被激发的次数没有区别,因为没有副作用(后果/then子句)。

 类似资料:
  • 问题内容: Django中对单表继承有显式支持吗?最后我听说,该功能仍在开发和辩论中。 在此期间是否可以使用库/黑客来捕获基本行为?我有一个混合了不同对象的层次结构。具有Employee类,雇员类型的子类和manager_id(parent_id)的公司结构的规范示例将很好地逼近我正在解决的问题。 就我而言,我想代表一个想法,即一个员工可以在由另一个员工管理的同时管理其他员工。没有用于Manage

  • 我是流口水的新手,熟悉使用扩展关键字来继承规则。问题是有没有办法继承多个规则?这类似于在java类上使用多个接口。这是一个我希望它如何工作的示例,但我在规则3上遇到错误:

  • 问题内容: 为什么我的猫没有nlegs属性? 我们应该从内部显式调用,还是应该做更有趣的事情? 如果我想创建一条5条腿的猫该怎么办,是否需要向该接口添加其他参数? 问题答案: 要建立在其他人都说过的基础上,是的,您需要调用父方法。 通常最好使用super。但是,在某些情况下(尤其是当您从多个类继承时),这可能是一个大难题。我将避免赘述,不乏讨论它的各种文章。(此外,其他一些“特殊”功能也有一些奇怪

  • 我有两个实体BillingAddress和ShippingAddress映射到具有鉴别器类型列的表地址。 我能够使用不同的类型值在DB中成功保存/更新两个地址类型。 我面临的问题是当我查询地址表时,如下所示: 这工作正常,但查询ShippingAddress会引发非均匀查询结果异常,即结果中同时包含ShippingAddress和Billingaddress。请让我知道,我应该怎么做。

  • 场景如下: 我有一个java pojo类,具有2个变量和以及适当的getter和setter。我正在使用决策表流,我想要: 条件:当类型设置为“1”时 操作:调用name类的setName setter,并从excel中设置适当的参数 现在,我想在java中访问name的这个集值。 这就是我所做的: Name.java- MainClass.java-这有口水实现!! 决策表e:: http://

  • 问题内容: 我听说有一种方法可以欺骗单一继承并在Java中实现多重继承。有谁知道如何实现这一点(不使用接口)? 出于好奇;-) 问题答案: 当然可以,但这很棘手,您应该真正考虑是否要这样做。 这个想法是结合使用基于范围的继承和基于类型的继承。出于内部目的,内部类“继承”外部类的方法和字段,这就是类型对话。这有点像mixin,其中将外部类混入到内部类中,但并不安全,因为您可以更改外部类的状态以及使用