0

我有一个关于如何评估 Drools 决策表的条件的问题。我曾认为条件是从左到右评估的,如果它检查给定规则的最左边的列是假的,它就不会检查剩余的条件。

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

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

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

|-----------------|--------------------------------|
|条件 |条件 |
|-----------------|--------------------------------|
|我的对象 |我的对象 |
|-----------------|--------------------------------|
|isNameEq("$param")|isValueEq("$param")|
|-----------------|--------------------------------|
|一个 |1 |
|A |2 |
|A |3 |
|A |4 |
|A |5 |
|B |4 |
|B |5 |
|B |6 |
|B |7 |
|-----------------|--------------------------------|

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

这两个函数包括一些简单的日志记录以显示它们何时被调用。对于 name=A 和 value=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?

感谢任何可以为我阐明这一点的人!

4

1 回答 1

0

电子表格的每一行都被翻译成一个规则,例如第 1 行:

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

另一个是“A”和“2”,以此类推。每个插入的事实都会根据这些规则逐一评估。

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

于 2014-04-01T06:38:04.533 回答