【问题标题】:Drools problem, why drools see just my first rule?流口水问题,为什么流口水只看到我的第一条规则?
【发布时间】:2020-02-11 16:45:59
【问题描述】:

我需要关于流口水的帮助。问题是当我运行一个应用程序(否则在春季完成)并且当我尝试触发所有规则时, 只有第一个规则启动,其他规则不能启动。

这是一个包含我的 3 条规则的我的 drl 文件。

    package drools.medicine

import com.example.demo.model.Pacijent;
import com.example.demo.model.Lek;
import com.example.demo.model.SastojakLeka;
import com.example.demo.model.Pregled;
import com.example.demo.model.ValidacijaDiagnoze;
import java.util.List;
import java.util.Set;
import java.util.HashSet;



rule "test-rule"
   agenda-group "alergija"
   when
       $vd: ValidacijaDiagnoze()
   then
       System.out.println("TEEEST!!!");
end



rule "Alergic-on-medicine"
    agenda-group "alergija"
    when
        $v: ValidacijaDiagnoze()
        $pregled: Pregled($prepisaniLek: prepisanLek)
        $lek: Lek() from $prepisaniLek
        $pacijent: Pacijent(alergicanNaLek($lek))
    then
        System.out.println("Pacijent je alergican na lek: "+ $lek.getNazivLeka());
        modify( $v ){
            setValid(false),
            setMessage("PATIENT IS ALLERGIC!")
        }
end


rule "Alergic-on-ingredient"
    agenda-group "alergija"
    lock-on-active
    when
        $v: ValidacijaDiagnoze()
        $pregled: Pregled($prepisaniLek: prepisanLek)
        $lek: Lek($sastojci: sastojak) from $prepisaniLek
        $sastojak: SastojakLeka() from $sastojci
        $pacijent: Pacijent(alergicanNaSastojak($sastojak))
    then
        System.out.println("Pacijent je alergican na sastojak " + $sastojak.getNazivSastojka());
        modify( $v ){
            setValid(false),
            setMessage("PATIENT IS ALLERGIC ON INGREDIENT!")
        }
end

下面是我调用 kieSession 来触发所有规则的地方。

// Take medicine(and ingredient) and decide throw rules are they ok or not.
    @CrossOrigin(origins = "http://localhost:3000")
    @PostMapping(value = "/validation")
    public ResponseEntity<?> validateDiagnosis(@RequestBody PregledDto pregledDto){

        //TO DO--   
        KieSession kieSession = kieContainer.getKieBase("MedicineBase").newKieSession();


        //initial state, witch can be changed in rules if patient is allergic
        ValidacijaDiagnoze vd = new ValidacijaDiagnoze();
        vd.setMessage("PATIENT IS NOT ALLERGIC");
        vd.setValid(true);


        FactHandle fact;
        fact =  kieSession.insert(vd);
        kieSession.getAgenda().getAgendaGroup("alergija").setFocus();
        System.out.println("Number of fired rules: "+ kieSession.fireAllRules()); // 1
        kieSession.dispose();

        return new ResponseEntity<>(vd, HttpStatus.OK);

    }

在 META-INF 文件夹中有我的 kmodule 文件。

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <kbase name="DiagnosisBase" packages="drools.diagnosis">
        <ksession name="diagnosis" />
    </kbase>

    <kbase name="DiagnosisBase2" packages="drools.diagnosis2">
        <ksession name="diagnosis2" />
    </kbase>

    <kbase name="MedicineBase" packages="drools.medicine">
        <ksession name="medicine" />
    </kbase>

</kmodule>

帮我解决问题,我是新来使用流口水的。

还请告诉我我在哪里犯了错误以及使用 drools 时的最佳做法是什么,非常感谢。

【问题讨论】:

  • 因为只有一个规则匹配您的输入。
  • 注意,其他两条规则要求您的工作记忆中存在患者(Pacijent),但您只是插入了一个 ValidacijaDiagnoze 实例。
  • 是的,这就是问题所在,现在当我添加耐心时,所有规则都被触发了。非常感谢。
  • 优秀。我将添加上述 cmets 作为解释情况的答案。与 Drools 玩得开心! :)

标签: drools


【解决方案1】:

kieSession.fireAllRules() 方法返回的数字是 Drools 引擎实际匹配并执行的规则数。如果规则的左侧('when'子句)与输入不匹配,则它不匹配,并且不会被执行。

在给出的示例规则中,测试规则仅检查工作内存中是否存在ValidacijaDiagnoze。其他两条规则要求 ValidacijaDiagnoze 包括子代(Lek 实例或 SastojakLeka 实例)以及 Pacijent 的实例也在工作内存中。

但是,在触发规则的代码中,只有一个 ValidacijaDiagnoze 像这样添加到工作内存中:

ValidacijaDiagnoze vd = new ValidacijaDiagnoze();
vd.setMessage("PATIENT IS NOT ALLERGIC");
vd.setValid(true);

由于此实例没有关联的LekSastojakLeka,因此不会触发其他规则。此外,由于工作内存中没有Pacijent,其他规则也不会触发。

因此,由于只有第一条规则可以触发,fireAllRules 返回 1,因为那是实际执行的规则数。

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 2018-02-03
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多