Drools Decision Table 对象比较给出了相反的结果
Drools Decision Table object comparison gives inverted results
考虑到 Drools,我一直在努力解决一个问题,这是我最后的选择。
假设我有一个包含 3 个人的列表:[1, 2, 3]。将此列表视为这些人的 ID 值列表。
现在,我想按以下顺序评估这些人的所有独特对:
- 第 1 人对第 2 人;
- 第 1 人对第 3 人;
- 第 2 人对第 3 人。
我的电子表格的规则表如下所示:
它利用了此评论中提到的技巧:。
Person class 已正确导入,三个人已插入到会话中,每个 Person 对象都有一个 getId()
方法。
但是,运行 fireAllRules()
在会话中给出了以下输出:
- 人 1 对人 1
- 人物 2 与人物 1
- 人 2 对人 2
- 人 3 对人 1
- 人物 3 对人物 2
- 人 3 对人 3
您可能会注意到这是我想要的结果集的补充。
请注意!胡乱猜测后发现,把条件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 文件中运行良好,并且符合预期!
所以我的问题是:
- 这是电子表格应该做的吗?
- 如果不是,我哪里做错了?
我在 Person 对象中还有一些更复杂的变量,我想对其应用逻辑(我想比较每个人的字符串映射),同样的事情也会发生;当我设置的条件未得到满足时,Drools 电子表格似乎让规则通过。针对相反的目标是可能的,并且有效,但对我来说,这似乎不是它应该起作用的方式。
提前致谢!
编辑 1:
使用 returns 生成的 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*/
中的 $ 丢失,并导致奇怪的评估。学过的知识;永远不要忘记钱。
我不知道运算符 <
或 >
是如何产生 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是必不可少的。在
中查看我的回答
PPS: 仔细阅读总是有帮助的。我忽略了您的问题中 /* param */
没有美元符号 ,因此生成的规则已 == "X"
附加到约束。看起来很奇怪,它以一种非常奇怪的方式编译和评估,我无法立即弄清楚。可能任何不等于 "true" 的字符串都被认为等于 "false",这将像否定一样工作并产生您无法理解的结果。难怪。 (很可能,MVEL的评估是在这个底部,产生了其他莫名其妙的效果。)
考虑到 Drools,我一直在努力解决一个问题,这是我最后的选择。
假设我有一个包含 3 个人的列表:[1, 2, 3]。将此列表视为这些人的 ID 值列表。 现在,我想按以下顺序评估这些人的所有独特对:
- 第 1 人对第 2 人;
- 第 1 人对第 3 人;
- 第 2 人对第 3 人。
我的电子表格的规则表如下所示:
它利用了此评论中提到的技巧:
Person class 已正确导入,三个人已插入到会话中,每个 Person 对象都有一个 getId()
方法。
但是,运行 fireAllRules()
在会话中给出了以下输出:
- 人 1 对人 1
- 人物 2 与人物 1
- 人 2 对人 2
- 人 3 对人 1
- 人物 3 对人物 2
- 人 3 对人 3
您可能会注意到这是我想要的结果集的补充。
请注意!胡乱猜测后发现,把条件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 文件中运行良好,并且符合预期!
所以我的问题是:
- 这是电子表格应该做的吗?
- 如果不是,我哪里做错了?
我在 Person 对象中还有一些更复杂的变量,我想对其应用逻辑(我想比较每个人的字符串映射),同样的事情也会发生;当我设置的条件未得到满足时,Drools 电子表格似乎让规则通过。针对相反的目标是可能的,并且有效,但对我来说,这似乎不是它应该起作用的方式。
提前致谢!
编辑 1: 使用
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*/
中的 $ 丢失,并导致奇怪的评估。学过的知识;永远不要忘记钱。
我不知道运算符 <
或 >
是如何产生 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是必不可少的。在
PPS: 仔细阅读总是有帮助的。我忽略了您的问题中 /* param */
没有美元符号 ,因此生成的规则已 == "X"
附加到约束。看起来很奇怪,它以一种非常奇怪的方式编译和评估,我无法立即弄清楚。可能任何不等于 "true" 的字符串都被认为等于 "false",这将像否定一样工作并产生您无法理解的结果。难怪。 (很可能,MVEL的评估是在这个底部,产生了其他莫名其妙的效果。)