Правила таблицы решений Drools, не использующие обновленные значения

Я использую сервер правил Drools как услугу. Мы используем таблицу решений

Pre Rules Movie Object:  
actor: "unknown"  
movie: "Ghostbusters"  
rating: 9

У меня есть 2 простых правила в таблице решений Drools. Первое правило проверяет значение (movie=="Ghostbusters"), а затем устанавливает вызовы, которые объекты setActor("Bill Murray").

Второе правило проверяет, кто такой Актер. Во втором правиле у меня 2 строки. if Actor == "Bill Murray" он вызывает действие setRating(10). И если actor == "unknown" setRating(8)

Первое правило срабатывает, как ожидалось, и я могу распечатать getActor, чтобы показать, что это «Билл Мюррей», но во втором правиле всегда срабатывает действие actor == "unknown". Даже если в этой строке я печатаю getActor, он печатает «Билл Мюррей», но использует правило «неизвестно».

Когда объект возвращается из правил, он имеет Actor = Bill Murray и все значения, установленные в правиле "правильные", но правила, кажется, всегда используют исходный объект, который я создал вне правила, при оценке правил.

Есть ли что-то, что я должен добавить в таблицу решений или вызов, чтобы вызвать сервер правил слюни, чтобы «обновить» объект между таблицами правил?


person JonoPEI    schedule 24.02.2011    source источник
comment
Как вы структурировали свою таблицу решений? Вы можете разместить это здесь?   -  person DJ.    schedule 25.07.2012


Ответы (2)


Я знаю, что прошло слишком много времени с тех пор, как вы задали вопрос, но для других с той же проблемой: как указано, вы должны изменить объект, а не устанавливать его. Для этого в таблицах решений добавьте столбец действий в таблицу правил, а во второй строке вы должны добавить:

modify($className){ setActor("Bill Murray")};

Оставьте первую строку под действием пустой.

person Ioannis Mitrolios    schedule 07.07.2016

вы должны использовать метод update или modify, как описано в документации Drools (4.8.4.1, 4.8.4.2):

rule "modify stilton"
when
    $stilton : Cheese(type == "stilton")
then
    modify( $stilton ){
        setPrice( 20 ),
        setAge( "overripe" )
    }
end

это сообщит движку, что объект был изменен, и правила будут применены повторно.

person andbi    schedule 26.02.2011