java - Drools 决策表对象比较给出了相反的结果

标签 java drools business-rules

考虑到 Drools,我一直在努力解决一个问题,这是我最后的选择。

假设我有一个包含 3 个人的列表:[1, 2, 3]。将此列表视为这些人的 ID 值列表。 现在,我想按以下顺序评估这些人的所有独特对:

  1. 第 1 人对第 2 人;
  2. 第 1 人对第 3 人;
  3. 第 2 人对第 3 人。

我的电子表格的规则表如下所示:

RuleTable PSBR

它利用了这条评论中提到的技巧:Drools compare two objects in decision table .

Person 类已正确导入,三个人已插入到 session 中,每个 Person 对象都有一个 getId()。方法。

但是,运行 fireAllRules()在 session 上给我以下输出:

  1. 第 1 个人与第 1 个人
  2. 第 2 人与第 1 人
  3. 第 2 个人与第 2 个人
  4. 第 3 人与第 1 人
  5. 第 3 个人与第 2 个人
  6. 第 3 人与第 3 人

您可能会注意到这是我想要的结果集的补充。

请注意!胡乱猜测后,原来是改变条件id > $id1id < $id1解决了这个问题,但随后逻辑在我脑海中似乎不匹配。

我试图模仿的规则如下所示:

rule "same-company"
    when
        $p1 : Person($id1 : id)
        $p2 : Person($id2 : id, id > $id1)
    then
        System.out.println($p1.getId() + " " + $p2.getId());
end

此规则在 .drl 文件中运行良好,并且符合预期!

所以我的问题是:

  1. 这是电子表格应该做的吗?
  2. 如果不是,我可能做错了什么?

我在 Person 对象中还有一些更复杂的变量,我想对其应用逻辑(每个人的字符串映射,我想比较其值),同样的事情也会发生;当我设置的条件未得到满足时,Drools 电子表格似乎让规则通过。针对相反的目标是可能的,并且有效,但对我来说,这似乎不是它应该起作用的方式。

提前致谢!


编辑 1: 使用 Drools - Using “from” in decision table 生成的 DRL返回以下结果:

package org.ps.dtable;
//generated from Decision Table
import org.ps.orm.Person;
// rule values at C12, header at C7
rule "PSBR_12"
    when
        $p1:Person ($id1: id) $p2:Person($id2:id, id > $id1 /*param*/ == "X")
    then
        System.out.println($p1 + " vs " + $p2);
end

Excel 电子表格如下所示: Spreadsheet

编辑 2: /*$param*/ 中的 $失踪了,引起了奇怪的评价。学过的知识;永远不要忘记钱。

最佳答案

我没看到运算符 <>可以生产1 vs 1 ,但这可能不是最重要的问题。

更重要的是,我无法使用 5.5 版重现此问题。

旧版本可能以不同方式处理这种特殊情况。然后重要的是要意识到电子表格编译器将约束(第 4 行中的内容)压缩到第 3 行的括号中(除非行是根据不同的模式形成的,添加了 ==自动)。您可以尝试在第二个 Person 之后添加一对括号

CONDITION
$p1:Person($id1:id) $p2:Person()
$id2:id > $id1 /*$param*/
pairs ordered by ascending id

如果这不起作用,您必须升级。

PS:对于调试,打印生成的 DRL 是必不可少的。在 Drools - Using "from" in decision table 中查看我的回答

PPS:仔细阅读总是有帮助的。我忽略了你有 /* param */ 在你的问题中没有美元符号,所以生成的规则有 == "X"附加到约束。看起来很奇怪,它以一种非常奇怪的方式编译和评估,我无法立即弄清楚。可能任何不等于“true”的字符串都被认为等于“false”,然后它会像否定一样工作并产生你无法弄清楚的结果。难怪。 (很可能,MVEL 评估处于底部,这产生了其他莫名其妙的效果。)

关于java - Drools 决策表对象比较给出了相反的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34686410/

相关文章:

需要基于Java的工作流引擎

java - Component.CENTER 不适用于 Tablelayout(特别是使用 CODENAMEONE)

java - 流口水:insertLogical 和 retract

java - Drools 规则中的映射和字符串

drools - 理解议程组流口水

aws-lambda - optaplanner 与 aws lambda

spring - Drools 无法在 Spring Boot 项目中加载规则

java - 用字符串替换 StringBuffer/StringBuilder

java - 在 eclipse 中复制文件将文件名(字符串)而不是文件复制到剪贴板

java - 如何从现有的 Unix 服务器连接连接到 FTP 服务器?