Слюни, возвращающие правило наименьшей заметности

Я сталкиваюсь с проблемой совпадения нескольких правил и получения правила с наименьшей заметностью. Это исходный файл.

package HotelAnalyticsLuxuryPromotions 
#generated from Decision Table
import com.mmt.analytics.hotel.promotions.drools.HotelPromotionsDroolsPojo;
import com.mmt.analytics.hotel.promotions.drools.HotelPromotionsDroolRules;
#From row number: 11
rule "for Luxury Hotel Promotions_11"
    salience 9
    when
        fact: HotelPromotionsDroolsPojo(
  eval(HotelPromotionsDroolRules.checkHotelId(fact,"12345")),
  eval(HotelPromotionsDroolRules.checkRsq(fact,"*")),
  eval(HotelPromotionsDroolRules.checkValidCheckInCheckOut(fact,"*")), 
  eval(HotelPromotionsDroolRules.checkLoggedStatus(fact,"*")))
        eval(HotelPromotionsDroolRules.checkActiveStatus(fact,"1"))
    then
        fact.setPackageName("Pack 2");
        fact.setRatePlanCode("ABC 2");
        fact.setTariffUrl("TariffUrl");
        fact.setClickUrl("ClickUrl");
        fact.setInclusionText("InclusionText");
end

#From row number: 12
rule "for Luxury Hotel Promotions_12"
    salience 10
    when
        fact: HotelPromotionsDroolsPojo(
  eval(HotelPromotionsDroolRules.checkHotelId(fact,"12345")), 
  eval(HotelPromotionsDroolRules.checkRsq(fact,"*")), 
  eval(HotelPromotionsDroolRules.checkValidCheckInCheckOut(fact,"*")), 
  eval(HotelPromotionsDroolRules.checkLoggedStatus(fact,"*")))
        eval(HotelPromotionsDroolRules.checkActiveStatus(fact,"1"))
    then
        fact.setPackageName("Pack 1");
        fact.setRatePlanCode("ABC 1");
        fact.setTariffUrl("TariffUrl");
        fact.setClickUrl("ClickUrl");
        fact.setInclusionText("InclusionText");
end

#From row number: 14
rule "for Luxury Hotel Promotions_14"
    salience 5
    when
        fact:HotelPromotionsDroolsPojo(
  eval(HotelPromotionsDroolRules.checkHotelId(fact,"12345")), 
  eval(HotelPromotionsDroolRules.checkRsq(fact,"*")), 
  eval(HotelPromotionsDroolRules.checkValidCheckInCheckOut(fact,"*")), 
  eval(HotelPromotionsDroolRules.checkLoggedStatus(fact,"*")))
        eval(HotelPromotionsDroolRules.checkActiveStatus(fact,"1"))
    then
        fact.setPackageName("Pack 3");
        fact.setRatePlanCode("ABC 3");
        fact.setTariffUrl("TariffUrl");
        fact.setClickUrl("ClickUrl");
        fact.setInclusionText("InclusionText");
end

Я думаю, что правило с наивысшим приоритетом должно быть возвращено, но я получаю обратное.

Ниже приведен код правила Engine

   StatelessKnowledgeSession kSession = promotionsDroolManager.getStatelessSession();
        kSession.execute(droolsPojo);

Я использую эти свойства конфигурации Drool

promotions.drools.agent.scan.resources=true
promotions.drools.agent.scan.directories=true
promotions.drools.resource.scanner.interval=1800
promotions.drools.agent.monitor.change.set.events=true
promotions.drools.knowledge.agent.name=Promotions_Knowledge_agent
promotions.drools.base.knowledge.agent.change.set.path=promotions.xml

Пожалуйста. предложить


person ankita gupta    schedule 19.01.2017    source источник


Ответы (3)


Если вы используете kie workbench для правил моделирования, вы можете добавить столбец атрибутов значимости, как показано ниже. Это гарантирует, что последнее правило в вашей таблице будет иметь наибольший приоритет.

важный столбец

person jomarko    schedule 20.01.2017

Как упомянул Лаун, значимость определяет только порядок, в котором выполняются последствия правил. В вашем случае, учитывая, что LHS (левая сторона) всех ваших правил одинакова, когда активируется 1 правило, все они. Затем Drools будет выполнять правую часть этих правил в порядке, определяемом значимостью каждого из правил. Правило с большей значимостью будет выполняться первым. Вот почему вы видите, что правило с меньшей заметностью было единственным, которое выполнялось. Это правило в основном перезаписывает то, что сделали другие 2 правила.

В вашем случае я бы сказал, что вам нужно установить атрибут activation-group ваших правил. Из документации по Drools:

Правила, принадлежащие к одной и той же группе активации, идентифицированной строковым значением этого атрибута, будут срабатывать только монопольно. Точнее, первое сработавшее правило в группе активации отменит все ожидающие активации всех правил в группе, т. е. остановит их срабатывание.

Итак, поместите все свои «исключительные» правила в один и тот же activation-group, чтобы при выполнении первой активации (с наивысшей значимостью) другие активации были отменены.

Надеюсь, поможет,

person Esteban Aliverti    schedule 20.01.2017

У вас есть три правила с одинаковыми левыми частями (условиями). Если один совпадает, то все совпадают. Если один стреляет, то стреляют все. Они стреляют в порядке, который вы контролируете с помощью значимости.

Правые части (последствия) очень похожи, значения в одинаковых сеттерах различаются. Если все они срабатывают, значения в последней группе сеттеров обязательно появятся в сопоставленном факте.

Это группа установщиков в правиле с наименьшей заметностью.

Изменить 1. Прежде всего: почему условия идентичны? Это не имеет смысла. 2. Предложение Эстебана — вариант. 3. Если вы не хотите запускать более одного правила, вызовите fireAllRules(1). 4. Добавьте ограничение, проверяющее, что одно из полей (например, packageName) все еще пустое. Вам нужно будет вызвать изменение или обновление:

when
   fact:HotelPromotionsDroolsPojo(packageName == null,
   ...
then
    fact.setPackageName("...");
    ...
    update( fact );
person laune    schedule 20.01.2017
comment
Спасибо Лауне за информацию. Можете ли вы сказать мне, если с той же левой стороны; как я могу получить взамен правило Highest Salience. - person ankita gupta; 20.01.2017
comment
Добавил несколько идей. - person laune; 20.01.2017