Слюни - срабатывает несколько правил, хотя все они принадлежат к одной группе активации - PullRequest
4 голосов
/ 20 сентября 2011

У меня есть следующий набор правил:

rule "Default Margin By Grade"
ruleflow-group "MarginByGrade"
enabled false
when
    $mg : MarginByGrade()
    $u  : PriceUnit( resale==null, trimGrade memberOf $mg.grades  )
then    
end

rule "Grade Margin By Group, Style" extends "Default Margin By Grade"
activation-group "Margin By Grade"
salience 500
when
    MarginByGrade(this == $mg, $u.model memberOf $mg.models,  $u.style memberOf $mg.styles)
then
    System.out.println("Found match : " + $mg);
end

rule "Grade Margin By Style" extends "Default Margin By Grade"
activation-group "Margin By Grade"
salience 100
when
    MarginByGrade(this == $mg, models == null, $u.style memberOf $mg.styles)
then
    System.out.println("Found match : " + $mg);
end

rule "Grade Margin By Group" extends "Default Margin By Grade"
activation-group "Margin By Grade"
salience 50
when
    MarginByGrade(this == $mg, prefixes memberOf prefixes, styles == null)
then
    System.out.println("Found match : " + $mg);
end

rule "Margin by Grade" extends "Default Margin By Grade"
salience 5
activation-group "Margin By Grade"
when
    MarginByGrade(this == $mg, prefixes == null, styles == null)
then
    System.out.println("Found match : " + $mg);
end

Правила запускаются на основе потока правил (отсюда и атрибут 'ruleflow-group'. Мое требование заключается в том, что как только правило с наивысшей значимостью срабатывает, правила с меньшей значимостью не должны срабатывать. Тем не менее, когда я запускаю факт, который активирует несколько правил, все активированные правила запускаются:

Start Process: Mon Sep 19 15:58:39 EDT 2011
Found match : MarginByGrade( prefixes=null, styles=null, grades=[C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S], margin=26.0000 )
Found match : MarginByGrade( prefixes=[015, 215], styles=[572], grades=[A, B, D], margin=25.5000 )
Found match : MarginByGrade( prefixes=[015, 010], styles=[515, 215, 572], grades=[C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S], margin=24.5000 )
015572  D 015572  D933079 FN 175->null
Dispose Session: Mon Sep 19 15:58:39 EDT 2011

Что я делаю не так? Я использую Drools Expert 5.2.0-Final.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

Хорошо, вы используете группу активации, а не группу правил? Не так ли? Группа активации приведет к тому, что будет выполнено только одно правило, и, как вы упомянули, будет выполнено правило с более высоким значением, если оно активировано. Приветствия

0 голосов
/ 27 июля 2018

Группа активации сработает один раз для одного MarginByGrade

Из вашей консоли выводится не менее 3 MarginByGrade, поэтому правильно использовать разные правила для каждого из этих 3 MarginByGrade

0 голосов
/ 07 июня 2018

Сессия без сохранения состояния:

Имейте в виду группу активации, если вы работаете с коллекцией фактов и сеансом без сохранения состояния, поскольку сработает только одно правило, оно пропустит другие факты. Лучшее решение - использовать Salience и обработанный флаг на фактах

...