Java Drools决策表对象比较给出了相反的结果
我一直在努力解决流口水的问题,这是我最后的选择 假设我有一个3人的列表:[1,2,3]。将此列表视为这些人的ID值列表。 现在,我想按照以下顺序评估这些人的所有独特配对:Java Drools决策表对象比较给出了相反的结果,java,drools,business-rules,Java,Drools,Business Rules,我一直在努力解决流口水的问题,这是我最后的选择 假设我有一个3人的列表:[1,2,3]。将此列表视为这些人的ID值列表。 现在,我想按照以下顺序评估这些人的所有独特配对: 第1人对第2人 第1人对第3人 第二人对第三人 我的电子表格的规则表如下所示: 它使用了此评论中提到的技巧: Person类已正确导入,三个人已插入会话,每个Person对象都有一个getId()方法 但是,在会话上运行fireAllRules()会提供以下输出: 一人对一人 二人对一人 第二人对第二人 三人对一人 第三人对
getId()
方法
但是,在会话上运行fireAllRules()
会提供以下输出:
id>$id1
更改为id<$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: 使用生成的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:
/*$param*/
中的$in丢失,导致计算异常。吸取的教训;永远不要忘记钱。我不知道运营商
如何产生1对,但这可能不是最重要的问题
更重要的是,我不能用5.5版重现这个问题
旧版本可能以不同的方式处理此特定情况。然后,重要的是要认识到电子表格编译器将约束(第4行中的约束)压缩到第3行的括号中(除非这些行是根据不同的模式形成的,并自动添加==)。你可以试着在第二个人后面加一对括号
CONDITION
$p1:Person($id1:id) $p2:Person()
$id2:id > $id1 /*$param*/
pairs ordered by ascending id
如果这不起作用,你必须升级
PS:对于调试,打印生成的DRL是必不可少的。请看我的答案
PPS:仔细阅读总是有帮助的。我忽略了问题中没有美元符号的/*param*/
,因此生成的规则将==“X”
附加到约束。奇怪的是,它以一种非常奇怪的方式编译和计算,我现在无法理解。可能任何不等于“true”的字符串都被视为等于“false”,这将像求反一样工作,并产生您无法理解的结果。难怪。(很可能,MVEL评估在这一部分的底部,这产生了其他令人困惑的效果。)关于“反向结果”,我希望看到生成的DRL(见我答案中的链接)与Excel单元格内容相结合。我已将这些内容添加到问题中!感谢您迄今为止的时间。感谢您添加原始代码和结果-这让我看到了丢失的内容。请参阅我答案中的PPS。谢谢!我试着加上它,但没用。我使用Maven导入来访问Drools,我所做的相关导入是kie api 6.3.0-Final
,kie ci 6.3.0.Final
,Drools决策表6.3.0.Final
。如果我错了,请纠正我,但我认为它们是最新版本。我是Maven的初学者,这可能就是问题所在。请注意,您可能想检查原始答案,它也没有$。我想这是合乎逻辑的,但我监督了它,所以其他人也可能(我的答案一直都是美元,但是,是的,你的问题没有,我也没有看到,正如我在回答中承认的那样。-我给Drools的使用列表写了一封电子邮件,让我们看看Drools是怎么说的。啊,我的意思是,对不起。这个答案是我一直想要的。^。^再次感谢,这对我帮助很大!