Drools:防止针对规则的每个排列发射

时间:2016-03-08 23:45:04

标签: set drools expert-system bpms

在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

使用非drools构造(例如规则翻转的成员标志)有很多方法可以做到这一点,但有没有办法用本机drools构造进行这种类型的检查(并保留事实知识库),而不是使用java解决方法

由于

1 个答案:

答案 0 :(得分:2)

标准设计模式是使用键属性强制对的订单。门票可能有序列号:

  $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