drools - Drool 无法正确对数字进行排序

标签 drools rule-engine

我是 Drools 的新手,正在尝试让示例程序正常工作。 drools 文档 http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/index.html#d0e9542 中给出了此示例。 这个流口水的规则预计可以对整数进行排序。我刚刚更改了示例中给出的数字,但它们没有按预期排序。 尝试使用drools版本5.5.0、5.5.1和master 6.0.0,但得到了相同的错误结果。

主要代码如下:

    package com.sample;

    public class Example2 {
      public static void main(String[] args) throws Exception {
        Number[] numbers = new Number[] { wrap(5), wrap(6), wrap(4), wrap(1), wrap(2) };
        new RuleRunner().runRules(new String[] { "Example3.drl" }, numbers);
      }

      private static Integer wrap(int i) {
        return new Integer(i);
      }
    }

RuleRunner 类与示例中给出的相同,我认为我不应该在这里给出它,因为它会使问题变得困惑。它只是创建知识库、有状态 session ,插入上面“numbers”数组中给定的事实,然后在 session 上调用 fireAllRules 方法。

规则文件(Example3.drl)是:


规则“规则 04”
方言“mvel”

$数字:数字()
不是 Number(intValue < $number.intValue)
那么
System.out.println("找到的数字,值为:"+ $number.intValue());
撤回($number);
结束

我得到的输出如下:

Loading file: Example3.drl
Inserting fact: 5
Inserting fact: 6
Inserting fact: 4
Inserting fact: 1
Inserting fact: 2
Number found with value: 1
Number found with value: 4
Number found with value: 2
Number found with value: 5
Number found with value: 6

不是正确的预期升序排序顺序。

我可能做错了什么?我无法想象 drools 规则引擎会在这个基础级别上被破坏。

最佳答案

这似乎是 5.5.0 以后引入的错误,并且仍然存在。
此排序代码适用于 5.4.0。

解决方法:


而不是:
  “not Number(intValue < $number.intValue)”
如果您使用:
  “not Number(intValue() < $number.intValue) )"
然后就可以了。



未告知其是函数的非 getter 方法似乎会产生问题。

一个令人衰弱的问题,会降低评估阶段对产品的信心。

关于drools - Drool 无法正确对数字进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14372663/

相关文章:

java - Drools 硬约束实现

java - 如何在没有 Eclipse 或任何其他 IDE 的情况下配置 drools

java - 无法在 drools 上运行 hello world - KieContainer 未从类路径中选取 dlr 文件

maven - 本地 Nexus 存储库通过 POM 依赖提取除主 jar 之外的所有内容

java - 对数组或集合中的元素进行高效的 Drools 评估

java - DRools:如何在事实中的任意嵌套列表上使用

logic - 什么是处理规则验证的最佳方法

java - (ILOG) IBM ODM 是否有使用像查找表这样的决策表或者这是一个不好的用法?

java - 用于根据规则集重命名/移动文件的 Java API

java - 带 TDB 的 Jena 规则引擎