Слюни: предотвратить стрельбу для каждой перестановки правила
Есть ли в слюнях способ проверить набор условий, а не пару условий? Я имею в виду, что у меня есть тип факта, называемый Ticket, и я вставил два факта Ticket с одним и тем же полем владельца; как предотвратить повторное срабатывание следующего правила? (один раз, когда A=$t1,B=$t2, и один раз, когда B=$t1,A=$t2)
rule "two tickets purchased by same person"
when
$t1 : Ticket($o : owner)
$t2 : Ticket(owner == $o, this != $t1)
then
do something...
end
Существует множество способов сделать это с конструкциями, не относящимися к drools (например, флаг члена, который переворачивает правило), но есть ли способ выполнить этот тип проверки с помощью нативной конструкции drools (и сохранить факты в базе знаний?).), а не использовать обходной путь Java
Спасибо
1 ответ
Стандартный шаблон дизайна - это использование ключевого атрибута для наложения порядка в паре. Билеты могут иметь серийный номер:
$t1 : Ticket($o : owner, $sno: serialNumber )
$t2 : Ticket(owner == $o, serialNumber > $sno )
Это исключает необходимость принудительного ограничения различных объектов.
Но три или более билетов по-прежнему создают аналогичную проблему. Поэтому вы также можете отслеживать билеты владельца:
rule "insert Owner"
when
$t: Ticket( $o: owner )
not TicketSet( owner == $o )
then
insert( new TicketSet( $t ) );
end
rule "more tickets of one Owner"
when
$t: Ticket( $o: owner )
$s: TicketSet( owner == $o, set not contains $t )
then
modify( $s ){ add( $t ) }
// $o buys n-th ticket
end