当前位置: 首页 > 知识库问答 >
问题:

Drools决策表对象比较得出相反的结果

慕容玉堂
2023-03-14

我一直在努力解决流口水的问题,这是我最后的选择。

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

  1. 第1人对第2人
  2. 第1人对第3人
  3. 第二人对抗第三人

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

它利用了这条评论中提到的一个技巧:Drools比较决策表中的两个对象。

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

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

  1. 第1人vs第1人

你可能会注意到,这是我想要的一组结果的补充。

请注意!经过胡乱猜测,结果是改变条件

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

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电子表格似乎会让规则通过。瞄准相反的目标是可能的,并且有效,但对我来说,这似乎不是应该的方式。

提前感谢!

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

编辑2:缺少$in/*$参数*/,导致计算异常。吸取的教训;永远不要忘记钱。

共有1个答案

司空和悌
2023-03-14

我看不出操作符如何

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

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

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

如果这不起作用,您将不得不升级。

PS:对于调试,打印生成的DRL是必不可少的。在Drools中查看我的答案-在决策表中使用“from”

PPS:仔细阅读总是有帮助的。我忽略了您的问题中没有美元符号,因此生成的规则将约束附加到了=“X”。奇怪的是,这是以一种非常奇怪的方式编译和计算的,我现在无法理解。可能任何不等于“true”的字符串都被视为等于“false”,这将像求反一样工作,并产生您无法理解的结果。难怪。(很可能,MVEL评估处于这一问题的底部,这产生了其他令人困惑的影响。)

 类似资料:
  • 我在DRL文件中有以下代码 终止 这是工程,但我需要将其转换为电子表格。我尝试了这么多的变体,但没有一个有效。如何在决策表中写入此规则?

  • 场景如下: 我有一个java pojo类,具有2个变量和以及适当的getter和setter。我正在使用决策表流,我想要: 条件:当类型设置为“1”时 操作:调用name类的setName setter,并从excel中设置适当的参数 现在,我想在java中访问name的这个集值。 这就是我所做的: Name.java- MainClass.java-这有口水实现!! 决策表e:: http://

  • 当我尝试使用Drools引擎计算保险费时,我有一个潜在的性能/内存瓶颈。 我在我的项目中使用Drools将业务逻辑与java代码分开,我决定也将其用于溢价计算。 我是不是用错了口水 如何以更高性能的方式满足要求 详情如下: 我必须为给定的合同计算保险费。 合约配置有 productCode(来自字典的代码) 合同代码(来自字典的代码) 客户的个人资料(例如年龄、地址) 保险金额(SI) 等等 目前

  • 我有一个drools决策表,其中包含条件和位置类型 我的excel如下所示 设置参数的代码如下 我按要求提供的excel文件条件对象: 需求级别==$参数位置类型==$参数 当我像上面那样设置时,我得到以下错误: 创建KieBase时出错[消息[id=1,级别=错误,路径=规则.xls,行=8,列=0文本=[错误102]行8:14不匹配的输入'=='在规则“替换规则”中],消息[id=2,级别=错

  • 两个 NavigableString 或 Tag 对象具有相同的HTML或XML结构时, Beautiful Soup就判断这两个对象相同. 这个例子中, 2个 <b> 标签在 BS 中是相同的, 尽管他们在文档树的不同位置, 但是具有相同的表象: “<b>pizza</b>” markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"

  • 两个 NavigableString 或 Tag 对象具有相同的HTML或XML结构时, Beautiful Soup就判断这两个对象相同. 这个例子中, 2个 <b> 标签在 BS 中是相同的, 尽管他们在文档树的不同位置, 但是具有相同的表象: “<b>pizza</b>” markup = "<p>I want <b>pizza</b> and more <b>pizza</b>!</p>"