Слюни: предотвращение срабатывания для каждой перестановки правила

Есть ли в drools способ проверить набор условий, а не пару условий? Под этим я подразумеваю следующее: допустим, у меня есть тип факта с именем 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

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

Спасибо


person Kdawg    schedule 08.03.2016    source источник


Ответы (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
person laune    schedule 09.03.2016