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

Drools决策表条件检查算法

贾成天
2023-03-14

我有一个关于如何评估Drools决策表的条件的问题。我原以为条件是从左到右计算的,如果它检查给定规则的最左边的列为false,它将不会检查其余的条件。

这对我来说很重要的一个原因是将范围最窄的条件放在最左边的概念。这意味着对象会更快地启动,而不是大多数满足广泛条件的对象首先并继续检查附加条件。

然而,这不是我在单元测试中看到的行为,我将在下面概述。

这个例子很简单,并不是为了演示范围的早期缩小。

|------------------|-------------------|
|Condition         |Condition          |
|------------------|-------------------|
|myObject          |myObject           |
|------------------|-------------------|
|isNameEq("$param")|isValueEq("$param")|
|------------------|-------------------|
|A                 |1                  |
|A                 |2                  |
|A                 |3                  |
|A                 |4                  |
|A                 |5                  |
|B                 |4                  |
|B                 |5                  |
|B                 |6                  |
|B                 |7                  |
|------------------|-------------------|

在本例中,isNameEq和isvalueq是来自java对象myObject的函数。请忽略任何轻微的Drools错误/缺少声明的导入,因为我知道我的测试工作正常,并且此插图是一个近似的场景。

这两个函数包括一些简单的日志记录,以显示何时调用它们。对于名称为A且值为3的对象,我原本希望isValueEq函数永远不会为名称(最左边)列中包含B的规则调用,因为该对象不满足此条件。

但是,日志记录表明函数调用是按以下顺序进行的:

  1. isNameEq(A)
  2. isNameEq(B)
  3. isValueEq(1)
  4. isValueEq(2)
  5. isValueEq(3)
  6. isValueEq(4)
  7. isValueEq(5)
  8. isValueEq(6)
  9. isValueEq(7)

这听起来正确吗?我只是在我的假设中弄错了吗?这是rete算法和缓存评估(节点?)的一部分吗?因为它没有为(B,4),(B,5)调用isValueEq?

感谢所有能为我阐明这一点的人!

共有1个答案

卞俊哲
2023-03-14

电子表格的每一行都转换为一条规则,例如第1行:

rule "whatever 1"
when
    MyObject( isNameEq("A"), isValueEq("1") )
then

另一个带有“A”和“2”,依此类推。每个插入的事实都根据这些规则逐个进行评估。

函数隐藏对事实数据的访问时,算法的好处(Rete或其他)可能不会变得有效。您可以尝试简单的约束(name==“A”,value==“1”),并通过修改getter来记录访问;这不会影响评估网络的构建方式。

 类似资料:
  • 我正在使用Drools 5.5.0,我有一个决策表,如下所示: 当我运行规则引擎时,我一次只插入一个SecurityContext,一次插入一个JSONWrapper。 仅基于此表,我的任何规则都不会被解雇(但它们都会得到评估)。我认为这是因为对于第二个条件,每个角色/规则的单元格都是空白的。 这就是我在DRL中努力追求的目标: 这条规则很好。 如何在我的决策表中设置一个条件,仅检查对象的存在,而

  • 当我尝试使用Drools引擎计算保险费时,我有一个潜在的性能/内存瓶颈。 我在我的项目中使用Drools将业务逻辑与java代码分开,我决定也将其用于溢价计算。 我是不是用错了口水 如何以更高性能的方式满足要求 详情如下: 我必须为给定的合同计算保险费。 合约配置有 productCode(来自字典的代码) 合同代码(来自字典的代码) 客户的个人资料(例如年龄、地址) 保险金额(SI) 等等 目前

  • 我有一个drools决策表,其中包含条件和位置类型 我的excel如下所示 设置参数的代码如下 我按要求提供的excel文件条件对象: 需求级别==$参数位置类型==$参数 当我像上面那样设置时,我得到以下错误: 创建KieBase时出错[消息[id=1,级别=错误,路径=规则.xls,行=8,列=0文本=[错误102]行8:14不匹配的输入'=='在规则“替换规则”中],消息[id=2,级别=错

  • 有人能帮我调试Drools中的决策表吗。对于我们的项目,我们正在创建一个包含1000多条规则的决策表。每当他们在规则中出现错误时,谁的电子表格不工作,也不显示准确的错误在哪里。

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

  • 我不喜欢流口水。我试图在drools决策表中添加一个自定义公式作为条件。有人能告诉我怎么做吗?我的公式是:abs(第1列-第2列) 函数:函数双abs_val(双总深度,双位深度){返回abs(总深度-位深度);} 错误:消息[id=5,kieBase=defaultKieBase,level=Error,path=rules/rules1.xlsx,line=15,column=0 text=规