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

如何从几个drools决策表中创建分数?,drools,Drools,我对drools还不熟悉,并尝试使用guvnor构建一个简单的计算器 一个例子是:假设你是一个30岁的男性,你从-9分开始。如果你的总胆固醇为180,加4分,如果你的吸烟者加8分,如果你的高密度脂蛋白胆固醇超过60,减1分,如果你的血压为135,则加1分。给你一个+3的结果 评分表上的表格对于drools决策表来说似乎是一个很好的场景 我不知道如何将各个分数相加。 我开始为我的结果栏创建一个新的“FraminghamScore”事实,但接下来我需要将这些事实加在一起 我试图将所有的表合并到1中,

我对drools还不熟悉,并尝试使用guvnor构建一个简单的计算器

一个例子是:假设你是一个30岁的男性,你从-9分开始。如果你的总胆固醇为180,加4分,如果你的吸烟者加8分,如果你的高密度脂蛋白胆固醇超过60,减1分,如果你的血压为135,则加1分。给你一个+3的结果

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

我不知道如何将各个分数相加。
我开始为我的结果栏创建一个新的“FraminghamScore”事实,但接下来我需要将这些事实加在一起

我试图将所有的表合并到1中,但很快就会变得复杂和冗余


看起来,如果我用java创建FraminghamScore,我可以调用incrementValue(int)方法,但我不知道如何将数字传递给它。

如果你决定重构你的应用程序,改用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
条件|条件|动作
-----------------------------------------------------------------------------------
$p:Person()|
$s:FraminghamScore()|
-----------------------------------------------------------------------------------
p、 性别|$param | s.增量($param);
||更新;
-----------------------------------------------------------------------------------

男性| p.age>=20&&p.age=35&&p.age如果您决定重构应用程序以使用drools,并且如果其他人正在寻找类似问题的解决方案,以下是我对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
条件|条件|动作
-----------------------------------------------------------------------------------
$p:Person()|
$s:FraminghamScore()|
-----------------------------------------------------------------------------------
p、 性别|$param | s.增量($param);
||更新;
-----------------------------------------------------------------------------------

男| p.age>=20&&p.age=35&&p.age嘿@Brian。你有没有想过如何实现这一点?我有类似的要求,目前我的想法是将sum对象作为全局对象传递给rules/decision表。使用int参数调用
incrementValue()
方法应该没有问题,或者是这样吗?谢谢。@JAndy我一直没弄明白这一点,我最终放弃了,只是在Drools之外用Java编写了它。不过,我会在某个时候再次提起这一点。Drools文档实际上不鼓励从操作中更改全局变量。建议的方法是改变事实。我添加了一个显示此选项的答案,尽管它恐怕不能解决重复检查的问题。你有没有想过如何实现这一点?我有类似的要求,目前我的想法是将sum对象作为全局对象传递给rules/decision表。使用int参数调用
incrementValue()
方法应该没有问题,或者是这样吗?谢谢。@JAndy我一直没弄明白这一点,我最终放弃了,只是在Drools之外用Java编写了它。不过,我会在某个时候再次提起这一点。Drools文档实际上不鼓励从操作中更改全局变量。建议的方法是改变事实。我添加了一个显示此选项的答案,尽管它恐怕无法解决重复检查的问题。这些年来,您对此解决方案有何改进?@user1428716不幸的是,在过去5年中,我没有做过任何Drools方面的工作,因此我无法提供更好的解决方案。TBH,甚至不能理解这个答案:)这些年来,这个解决方案有什么改进吗?@user1428716不幸的是,我在过去5年里没有做过任何Drools的事情,所以我无法提供更好的解决方案。TBH,我甚至不能理解这个答案:)