java – Drools Decision Table对象比较给出反转结果

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

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

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

我的电子表格的RuleTable如下所示:

《java – Drools Decision Table对象比较给出反转结果》

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

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

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

>人1对人1
>人2对人1
>人2对人2
>人3对人1
>人3对人2
>人3对人3

您可能会注意到,这是我希望得到的结果集的补充.

请注意!经过疯狂猜测后,结果发现改变条件ID> $id1 toid< $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文件中单独使用!

所以我的问题是:

>这是电子表格应该做的吗?
>如果没有,我在这里做错了什么?

我还在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电子表格如下所示:

编辑2:
$in / * $param * /丢失了,导致了奇怪的评估.学过的知识;永远不要忘记钱.

最佳答案 我没看到操作符 可能会产生1比1,但这可能不是最重要的问题.

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

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

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评估处于最底层,这产生了其他令人困惑的影响.)

点赞