2016-04-16 25 views
-1

Ich versuche einige Nachrichten zu zeigen, wenn eine kranke Person eine Diagnose hat. Die Regel, um dies zu zeigen, ist "Imprime diagnosticos" Das Problem hier ist, dass dieser Code keine Drucknachricht zeigt ... und läuft in Endlosschleife.Drools 6.0.3 Regeln - Warum läuft dieser Code in Endlosschleife?

package com.sample 

rule "sem sintomas 1" 
salience 100 
when 
    $p : Paciente() 
    forall($s : Sintomas(idPessoa != $p.getId())) 
then 
    $p.setDiagnostico("sem sintomas definidos"); 
    update($p); 
end 

rule "sem sintomas 2" 
salience 90 
when 
    $s1 : Sintomas(sintoma == "dores") 
    $s2 : Sintomas(sintoma == "manchas") 
    $p : Paciente(id == $s1.getIdPessoa(), id == $s2.getIdPessoa(), diagnostico == "") 
then 
    $p.setDiagnostico("sem sintomas definidos"); 
    update($p); 
end 

rule "gripe" 
salience 60 
when 
    $s1 : Sintomas(sintoma == "febre") 
    $s2 : Sintomas(sintoma == "dores") 
    $p : Paciente(id == $s1.getIdPessoa(), id == $s2.getIdPessoa(), diagnostico == "") 
then 
    $p.setDiagnostico("gripe"); 
    update($p); 
end 

rule "enxatema 1" 
salience 80 
when 
    $s1 : Sintomas(sintoma == "febre") 
    $s2 : Sintomas(sintoma == "dores") 
    $s3 : Sintomas(sintoma == "manchas") 
    $p : Paciente(id == $s1.getIdPessoa(), id == $s2.getIdPessoa(), id == $s3.getIdPessoa(), diagnostico == "", idade >= 15) 
then 
    $p.setDiagnostico("enxatema"); 
    update($p); 
end 

rule "enxatema 2" 
salience 70 
when 
    $s1 : Sintomas(sintoma == "febre") 
    $s2 : Sintomas(sintoma == "manchas") 
    $p : Paciente(id == $s1.getIdPessoa(), id == $s2.getIdPessoa(), diagnostico == "", idade < 15) 
then 
    $p.setDiagnostico("enxatema"); 
    update($p); 
end 

rule "resfriado" 
salience 50 
when 
    $s1 : Sintomas(sintoma == "febre") 
    $p : Paciente(id == $s1.getIdPessoa(), diagnostico == "") 
then 
    $p.setDiagnostico("resfriado"); 
    update($p); 
end 

rule "Imprime diagnosticos" 
salience 40 
when 
    $s : Sintomas() 
    $p : Paciente(id == $s.getIdPessoa(), diagnostico != "") 
then 
    System.out.println("Paciente " + $p.getNome() + " com diagnóstico: " + $p.getDiagnostico()); 
end 

Hier ist das Java-Programm Einfügen der Fakten:

package com.sample; 

import org.kie.api.KieServices; 
import org.kie.api.runtime.KieContainer; 
import org.kie.api.runtime.KieSession; 

public class DroolsTest { 

public static final void main(String[] args) { 
    try { 
     // load up the knowledge base 
     KieServices ks = KieServices.Factory.get(); 
     KieContainer kContainer = ks.getKieClasspathContainer(); 
     KieSession kSession = kContainer.newKieSession("ksession-rules"); 

     // go ! 
     Paciente p1 = new Paciente("001", "Ana Melo", "", 33); 
     Paciente p2 = new Paciente("002", "Rui Costa", "", 13); 
     Paciente p3 = new Paciente("003", "Joana Martins", "", 85); 
     Paciente p4 = new Paciente("004", "Pedro Torres","", 53); 
     Paciente p5 = new Paciente("005", "Ana Gomes", "", 93); 
     Paciente p6 = new Paciente("006", "Jorge Costa", "", 56); 

     Sintomas s1 = new Sintomas("001", "febre"); 
     Sintomas s2 = new Sintomas("001", "dores"); 
     Sintomas s3 = new Sintomas("001", "manchas"); 
     Sintomas s4 = new Sintomas("002", "febre"); 
     Sintomas s5 = new Sintomas("002", "manchas"); 
     Sintomas s6 = new Sintomas("003", "febre"); 
     Sintomas s7 = new Sintomas("003", "dores"); 
     Sintomas s8 = new Sintomas("004", "febre"); 
     Sintomas s9 = new Sintomas("006", "manchas"); 
     Sintomas s10 = new Sintomas("006", "dores"); 

     kSession.insert(p1); 
     kSession.insert(p2); 
     kSession.insert(p3); 
     kSession.insert(p4); 
     kSession.insert(p5); 
     kSession.insert(p6); 

     kSession.insert(s1); 
     kSession.insert(s2); 
     kSession.insert(s3); 
     kSession.insert(s4); 
     kSession.insert(s5); 
     kSession.insert(s6); 
     kSession.insert(s7); 
     kSession.insert(s8); 
     kSession.insert(s9); 
     kSession.insert(s10); 
     kSession.fireAllRules(); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 
} 
} 

public class Paciente { 
    private String id, nome, diagnostico; 
    private int idade; 
    //... 
} 

public class Sintomas { 
    private String idPessoa, sintoma; 
    //... 
} 

Vielen Dank für all die Hilfe,

+0

[Link] (http://pastebin.com/H13Ct4GV) [Link] (http://pastebin.com/VP04F0PG) –

+0

Willkommen bei SO. Bitte werfen Sie einen Blick auf diesen hilfreichen Artikel [MCVE], um eine Frage zu stellen, die relativ einfach zu beantworten ist. – roadrunner66

+0

Verwenden Sie keine Links zu Pastebin & Co. Sie werden früher oder später verschwinden, und dann wird die Frage nutzlos sein. – laune

Antwort

0

Sie haben mithilfe der Einschränkung

$p : Paciente(diagnostico == "") 

in der Regel zu vermeiden looping "Sem Sintomas 1" auch.

Empfehlung: Sie sollten

modify($p){ setDiagnostico("...") } 

anstatt Update verwenden.

Diese ID-Werte ("001", ...) sind seltsam: Sie identifizieren kein Symptom und identifizieren keine Patienten, weil sie dann nicht zusammen mit einem Symptom gespeichert werden. Normalerweise identifiziert man Symptome mit einem Schlüssel (z. B. ICD-10), und Patienten hätten eine Liste von Symptomschlüsseln. Dann kann eine Regel die Krankheit durch das Vorhandensein und Fehlen von Symptomen bestimmen.

Ich bin mir nicht sicher, was Ihre IDs identifizieren sollen. Die starke Verwendung von Salienz ist ein Hinweis darauf, dass etwas nicht stimmt. Dies sollte nur in der letzten Regel mit einem (niedrigen) Salienz möglich sein, um das Ergebnis für jeden Patienten auszudrucken.