混合XLS和DRL文件时,显着性值是否正常工作?

时间:2014-04-15 11:44:08

标签: drools

我在DRL文本文件和XLS电子表格文件中定义了不同的规则。首先执行我的XLS规则我无法理解原因。该示例是管理具有不同类别和答案的表单。答案的分数用于向用户返回一些信息。

我的第一个DRL规则是对所有类别中的所有问题的所有分数求和:

package Form;

import ...;
rule "Sum Category Score"
salience 500
when
$form : SubmittedForm();
$cat : CategoryWithScore(score == null) from $form.categories;
$categoryScore : Number() from
    accumulate($q : Question() from $cat.getQuestions(), 
                init( int $total = 0 ),
                action( $total += $q.getAnswer().getScore(); ),
                reverse( $total -= $q.getAnswer().getScore(); ),
                result( $total ) 
            );
 then
    $cat.setScore($categoryScore);
 end

使用XLS文件,我根据总分数定义类别的结果。

XLS definition

我们可以看到,DRL文件有salience 500,XLS文件有salience 250。然后我希望首先执行DRL规则。

如果我以规则格式打印XLS,一切看起来都是正确的:

package ScoreClassification;
//generated from Decision Table
import ...;
    no-loop true
    salience 250
// rule values at B13, header at B8
rule "Form Score Classification_13"
       when
            $form : SubmittedForm(); $cat : CategoryWithScore($cat.getText() == 'Cat1', $cat.getScore() >= 0, $cat.getScore() < 40) from $form.getCategoriesWithScore();
    then
            $cat.setResult('Good');
 end

// rule values at B14, header at B8
...

我在该类别的System.out.printlngetScore方法中添加了一些简单的setScore,以了解正在发生的事情。我可以看到getScore首先执行! (并且具有空值)以及后来setScore正确分配值。

为什么显着不受尊重?

1 个答案:

答案 0 :(得分:0)

三件事。

首先,您必须使用修改来改变工作记忆中的事实。

 rule "Sum Category Score"
 ...
 then
     modify( $cat ){ setScore( $categoryScore ) }
 end

否则,规则评估将永远不会看到更改的值。

在OPs第一条评论后添加 其次,如果修改是在事实中的集合中保存的对象并使用from提取,则事情开始变得模糊。我避免这种情况,建议你也这样做。插入CategoryWithScore个事实,您的问题就解决了。 (如果WM同时存在多个表单,您可能必须确定所选CategoryWithScore个事实属于同一个SubmittedForm。)

第三,普遍的误解是优先级(或显着性)对左侧评估的影响有影响,并且可用于推迟对约束表达可能遇到NPE的规则的评估。最佳做法是编写约束,以便空值导致短路错误。

如果你认为这种混乱的规则:是的,你是对的。但是,当类成员设置为某个默认值或带外值(在您的情况下可能为-1)而不是保留为null时,即使纯Java代码也更强大。