如何从几个drools决策表创建一个分数?

时间:2012-10-27 00:17:26

标签: drools

我刚开始流口水,并尝试使用guvnor构建一个简单的Framingham score计算器。

一个例子是:假设你是一个30岁男性,你以-9分开始。如果你的总胆固醇是180,加4分,如果你的吸烟者加8分,如果你的HDL胆固醇超过60,减去1分,如果你的血压是135,那么加1分。给你+3的结果。

评分表上的表格对于流氓决策表来说似乎是一个很好的场景。

我无法弄清楚如何将各个分数加在一起 我盯着为我的结果专栏创建一个新的“FraminghamScore”事实,但后来我需要将这些事实加在一起。

我尝试将所有表格加入到1中,但这很快就会变得复杂多余。

看起来如果我在java中创建我的FraminghamScore,我可以使用一个我可以调用的incrementValue(int)方法,但后来我无法弄清楚如何将数字传递给它。

1 个答案:

答案 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然后进行数学运算。这可能会使您的决策表更加清晰。