Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Drools决策表对象比较给出了相反的结果_Java_Drools_Business Rules - Fatal编程技术网

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

Java Drools决策表对象比较给出了相反的结果,java,drools,business-rules,Java,Drools,Business Rules,我一直在努力解决流口水的问题,这是我最后的选择 假设我有一个3人的列表:[1,2,3]。将此列表视为这些人的ID值列表。 现在,我想按照以下顺序评估这些人的所有独特配对: 第1人对第2人 第1人对第3人 第二人对第三人 我的电子表格的规则表如下所示: 它使用了此评论中提到的技巧: Person类已正确导入,三个人已插入会话,每个Person对象都有一个getId()方法 但是,在会话上运行fireAllRules()会提供以下输出: 一人对一人 二人对一人 第二人对第二人 三人对一人 第三人对

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

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

  • 第1人对第2人
  • 第1人对第3人
  • 第二人对第三人
  • 我的电子表格的规则表如下所示:

    它使用了此评论中提到的技巧:

    Person类已正确导入,三个人已插入会话,每个Person对象都有一个
    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文件中运行良好,正如预期的那样

    因此,我的问题是:

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

    提前谢谢


    编辑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是怎么说的。啊,我的意思是,对不起。这个答案是我一直想要的。^。^再次感谢,这对我帮助很大!