Drools:防止为规则的每个排列触发
Drools: prevent firing for each permutation of a rule
在 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 解决方法
谢谢
标准设计模式是使用键属性强制对进行排序。门票可能有序列号:
$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
在 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 解决方法
谢谢
标准设计模式是使用键属性强制对进行排序。门票可能有序列号:
$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