我在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文件,我根据总分数定义类别的结果。
我们可以看到,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.println
和getScore
方法中添加了一些简单的setScore
,以了解正在发生的事情。我可以看到getScore
首先执行! (并且具有空值)以及后来setScore
正确分配值。
为什么显着不受尊重?
答案 0 :(得分:0)
三件事。
首先,您必须使用修改来改变工作记忆中的事实。
rule "Sum Category Score"
...
then
modify( $cat ){ setScore( $categoryScore ) }
end
否则,规则评估将永远不会看到更改的值。
在OPs第一条评论后添加
其次,如果修改是在事实中的集合中保存的对象并使用from提取,则事情开始变得模糊。我避免这种情况,建议你也这样做。插入CategoryWithScore
个事实,您的问题就解决了。 (如果WM同时存在多个表单,您可能必须确定所选CategoryWithScore
个事实属于同一个SubmittedForm
。)
第三,普遍的误解是优先级(或显着性)对左侧评估的影响有影响,并且可用于推迟对约束表达可能遇到NPE的规则的评估。最佳做法是编写约束,以便空值导致短路错误。
如果你认为这种混乱的规则:是的,你是对的。但是,当类成员设置为某个默认值或带外值(在您的情况下可能为-1)而不是保留为null时,即使纯Java代码也更强大。