2017-04-26 4 views
0

Regel "one"geifert Aktivierung-Gruppe arbeitet nicht wie erwartet

activation-group "Harris" 

salience 10 

when 

    $p : Person(age < 10); 

then 

    $p.setDiscount(0.1); 

Ende

Regel "zwei"

activation-group "Harris" 

salience 10 

when 

    $p : Person(age > 10); 

then 

    $p.setDiscount(0.2); 

Ende

Wenn ich einige Personen einsetzen zu arbeiten Speicher durch KSession.insert (Object), nur die erste Person wird ausgewertet, die anderen Personen werden einfach ignoriert. Mein Verständnis über Drools Aktivierungs-Gruppe ist, dass, wenn ich X Anzahl der Regeln, die zu der gleichen Aktivierungs-Gruppe mit verschiedenen Salienz Werte gehören, jeder Person wird von den Regeln verarbeitet werden und die mit der höchsten Salience wird gefeuert und Der Rest wird ignoriert. Sobald das abgeschlossen ist, wird die nächste Person durchkommen und den Vorgang wiederholen. Was Ich habe erlebt, dass die erste Person, die eine Regel in dieser Aktivierungsgruppe auslöst, die gesamte Aktivierungsgruppe deaktiviert und keine weiteren Personen werden verarbeitet. Irgendwelche Vorschläge?

+0

Zusätzlich zu laune Antwort unten Option a, wenn Sie keine Joins mit anderen Regeln auf mehreren 'Person' Instanzen durchführen müssen, könnten Sie eine StatelessKieSession verwenden, die für jede gegebene 'Person' Instanz – tarilabs

Antwort

0

"Nur eine Regel innerhalb einer Aktivierungsgruppe wird ausgelöst, d. H. Die erste, die ausgelöst wird, löscht alle vorhandenen Aktivierungen anderer Regeln innerhalb derselben Gruppe." Das ist ziemlich explizit.

Verwenden Sie keine Aktivierungsgruppe, wenn Sie dasselbe für viele Person-Fakten tun möchten.

(a) Nur einen einfügen, alle Regeln löschen - wiederholen.

(b) Setzen Sie viele Personen ein, feuern Sie alle Regeln, aber ziehen Sie eine Person fact in jeder Konsequenz zurück.

Salienz ist fast immer schlecht. Verwenden Sie Logik (Constraints) für die feinkörnige Steuerung der Regelzündreihenfolge.

+0

Danke, jetzt ich benutze die Methode a, wiederhole einen Fakt und feuere, aber ich denke, das ist eine geringe Leistung. Was ist die Methode b genau? Ich füge wie "retract ($ p)" für jede Regel RHS hinzu, aber es ist nutzlos. – John

+0

Was lässt Sie denken, dass dies "geringe Leistung" ist? --- Was meinst du mit "es ist nutzlos"? Sicherlich bleibt die Tatsache nicht im WM und feuert mehr Regeln !? – laune

+0

Ich füge "retract ($ p)" für jede Regel RHS, aber nach wie vor nur die erste Person gefeuert, der Rest einfach ignoriert werden. – John