流口水问题,为什么流口水只看到我的第一条规则?
Drools problem, why drools see just my first rule?
我需要流口水方面的帮助。问题是当我 运行 一个应用程序(在 spring 中完成)并且当我尝试触发所有规则时,
只有第一条规则启动,其他规则无法启动。
这是我的 drl 文件,其中包含我的 3 条规则。
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>
帮我解决问题我是新手。
也让我知道我在哪里犯了错误以及使用流口水的最佳做法是什么,非常感谢。
方法kieSession.fireAllRules()
返回的数字是Drools引擎实际匹配并执行的规则数。如果规则的左侧('when' 子句)与输入不匹配,则不匹配,并且不会执行。
在给出的示例规则中,测试规则仅检查工作内存中是否存在 ValidacijaDiagnoze
。其他两条规则要求 ValidacijaDiagnoze
包括 children(一个 Lek
实例或 SastojakLeka
实例)以及也在工作内存中的 Pacijent
实例。
但是,在触发规则的代码中,只有一个 ValidacijaDiagnoze
被添加到工作内存中,如下所示:
ValidacijaDiagnoze vd = new ValidacijaDiagnoze();
vd.setMessage("PATIENT IS NOT ALLERGIC");
vd.setValid(true);
由于此实例没有 Lek
或 SastojakLeka
关联,因此不会触发其他规则。此外,由于工作内存中没有 Pacijent
,因此其他规则也不会触发。
因此,由于只有第一个规则可以触发,fireAllRules
returns 1 因为那是实际执行的规则数。
我需要流口水方面的帮助。问题是当我 运行 一个应用程序(在 spring 中完成)并且当我尝试触发所有规则时, 只有第一条规则启动,其他规则无法启动。
这是我的 drl 文件,其中包含我的 3 条规则。
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>
帮我解决问题我是新手。
也让我知道我在哪里犯了错误以及使用流口水的最佳做法是什么,非常感谢。
方法kieSession.fireAllRules()
返回的数字是Drools引擎实际匹配并执行的规则数。如果规则的左侧('when' 子句)与输入不匹配,则不匹配,并且不会执行。
在给出的示例规则中,测试规则仅检查工作内存中是否存在 ValidacijaDiagnoze
。其他两条规则要求 ValidacijaDiagnoze
包括 children(一个 Lek
实例或 SastojakLeka
实例)以及也在工作内存中的 Pacijent
实例。
但是,在触发规则的代码中,只有一个 ValidacijaDiagnoze
被添加到工作内存中,如下所示:
ValidacijaDiagnoze vd = new ValidacijaDiagnoze();
vd.setMessage("PATIENT IS NOT ALLERGIC");
vd.setValid(true);
由于此实例没有 Lek
或 SastojakLeka
关联,因此不会触发其他规则。此外,由于工作内存中没有 Pacijent
,因此其他规则也不会触发。
因此,由于只有第一个规则可以触发,fireAllRules
returns 1 因为那是实际执行的规则数。