在Drools中为组执行单个规则

时间:2018-11-04 20:07:06

标签: java drools expert-system

我正在基于立法的专家系统上工作,我有很多类似的规则:

规则1: 如果缉获量大于3000,则扣押该量,理由法为100

规则2:如果扣押属于家庭类型,则扣押金额,依据法律200

问题是“扣押”操作只能应用一次,但是我需要保存所符合规则的历史记录,下面提供一个示例

rule "law 100"

when 
  $seizure: Seizure(amount>3000)
then
  $seizure.getRules().add("Justification: law 100 of the civil that says bla bla");
  $seizure.applyPunishment();

rule "law 200"

when 
  $seizure: Seizure(type == TYPES.Family)
then
  $seizure.getRules().add("Justification: law 200 of the family code that says bla bla");
  $seizure.applyPunishment();

如上所述,我需要“ then”部分来保存描述规则“ $ seizure.getRules()。add(“正当性:民法则”);“。我还需要“ $ seizure.applyPunishment();”已在规则1中应用,则不会在规则2中重新应用。

感谢您的咨询

1 个答案:

答案 0 :(得分:1)

您在这里有几种选择。

  1. applyPunishment更改为幂等。

    您没有显示applyPunishment的代码,但看起来像

    private boolean alreadySeized = false;
    
    public void applyPunishment() {
        if (alreadySeized) {
            return;
        }
    
        alreadySeized = true;
    

    您还可以基于已经存在的其他一些变量。例如。 if (seizedAmount > 0) return;。但是很难说没有代码怎么办。

  2. 您可以将applyPunishment更改为markForPunishment,类似于

    private boolean markedForPunishment;
    
    public void markForPunishment() {
        markedForPunishment = true;
    }
    

    然后添加

    之类的规则
    rule "Punish"
    
    when
      $seizure: Seizure(markedForPunishment  == true)
    then
      $seizure.applyPunishment();
    

    使用适当的吸气剂。

    您的其他规则将调用markForPunishment而不是applyPunishment

  3. 您可以使用ruleflow将正当理由与惩罚分开。

  4. 您可以在规则中使用的then子句中set a variable

可能还有其他选择。要做的最大决定是需要MVEL解决方案还是Java解决方案。其中几个选项都需要同时更改。