Что происходит в алгоритме rete, когда есть несколько "тогда"
Используя это в качестве примера, скажем, что есть условие, которое говорит:
if the flyer's status is silver, then allow free upgrade to business class **and** give a free drink
Как построить сеть? В нижней части сети будет два узла - 1) бесплатное обновление 2) бесплатный напиток
Как эти два узла должны быть связаны с "серебряным" узлом?
Все примеры, которые я видел, связанные с алгоритмом Rete, говорят об одном "тогда"
1 ответ
Если 2 действия выполняются в одном и том же правиле, то после "серебряного" альфа-узла будет построен только 1 узел действия. Т.е.
rule "Allow free upgrade to business class and give a free drink to Silver flyers"
no-loop true
when
$a: Account (status == "SILVER")
then
modify($a){
.setFreeUpgrade(true);
.setFreeDrinks(true);
}
end
Слюни рассматривают RHS правил как черный ящик. RHS всегда представляется как узел действия в сети RETE. Это верно даже для правил, имеющих одинаковую RHS: будут созданы два узла действия.
Если вы реализуете то же бизнес-правило, что и 2 отдельных правила, то будут созданы 2 узла действий:
rule "Allow free upgrade to business class to Silver flyers"
lock-on-active true
when
$a: Account (status == "SILVER")
then
modify($a){
.setFreeUpgrade(true);
}
end
rule "Give a free drink to Silver flyers"
lock-on-active true
when
$a: Account (status == "SILVER")
then
modify($a){
.setFreeDrinks(true);
}
end
Далее мы можем обсудить, какой подход лучше, но чтобы ответить на ваш вопрос, я думаю, что этого достаточно: сеть RETE будет содержать AS MANY узлов действий.
Если вы используете плагин Drools' eclipse', вы можете увидеть сеть RETE, созданную для одного файла.DRL. При редактировании DRL вы увидите вкладку в нижней части редактора для проверки генерируемой сети RETE.
Надеюсь, поможет,