我刚开始流口水,并尝试使用guvnor构建一个简单的Framingham score计算器。
一个例子是:假设你是一个30岁男性,你以-9分开始。如果你的总胆固醇是180,加4分,如果你的吸烟者加8分,如果你的HDL胆固醇超过60,减去1分,如果你的血压是135,那么加1分。给你+3的结果。
评分表上的表格对于流氓决策表来说似乎是一个很好的场景。
我无法弄清楚如何将各个分数加在一起 我盯着为我的结果专栏创建一个新的“FraminghamScore”事实,但后来我需要将这些事实加在一起。
我尝试将所有表格加入到1中,但这很快就会变得复杂多余。
看起来如果我在java中创建我的FraminghamScore,我可以使用一个我可以调用的incrementValue(int)方法,但后来我无法弄清楚如何将数字传递给它。
答案 0 :(得分:0)
如果您决定重构您的应用以使用drools,并且如果其他人正在寻找类似问题的解决方案,那么这是我的两分钱流氓知识。
您的事实可能是这样的
// Fact for the scoring
class FraminghamScore {
private int total;
public void increment( int value ) { total += value; }
public int getTotal() { return total; }
}
// Fact for the subject
class Person {
public enum Gender{ MALE, FEMALE };
private Gender gender;
private int age;
private int cholesterol;
private boolean smoker;
// Rest of the fields + getter/setters as needed
}
您的决策表如下所示。正如我所看到的那样,年龄检查会有一些重复,例如,我想不出办法摆脱那些。
Condition | Condition | Action
-----------------------------------------------------------------------------------
$p : Person() |
$s : FraminghamScore() |
-----------------------------------------------------------------------------------
p.gender | $param | s.increment($param);
| | update(s);
-----------------------------------------------------------------------------------
MALE | p.age >= 20 && p.age <= 34 | -9
MALE | p.age >= 35 && p.age <= 39 | -5
-- Rest of the age groups + same for females
Condition | Condition | Action
-----------------------------------------------------------------------------------
$p : Person() |
$s : FraminghamScore() |
-----------------------------------------------------------------------------------
p.gender | p.smoker | s.increment($param);
| | update(s);
-----------------------------------------------------------------------------------
MALE | true | -9
MALE | false | -5
等等。
现在查看表格,我发现年龄检查会有很多重复。但是,现在想不出更好的方法。希望这有助于至少一点。
修改强>
你可以让FraminhamScore事实只保留每条规则的点数,而不是将它们加在一起。使用此选项,您可以将每个规则的分数事实添加到工作内存中,最后添加use query to fetch them然后进行数学运算。这可能会使您的决策表更加清晰。