使用 modify/update 会产生不一致的数据

Using modify/update creates inconsistent data

我在列表中得到不一致的数据,列表中的数据添加到规则 1 中。规则 2 修改了包含列表的对象,因为 update/modify 规则被重复调用。

rule "Rule 1"
dialect "java"
no-loop true
when
    $notification:NotificationVO();
    $snrData : SensorDataVO(getOffsetChngesInterval()!=null,
                            getOffsetChngesInterval().size()>0);
    $pestWeight:Integer() from $snrData.getOffsetChngesInterval();
    $masterData: MasterDataVO($pestWeight==rodentWeight);
then
    System.out.println("Rule 2");
    modify($notification){getFilteredMasterData().add($masterData)};
end

rule "Rule 2"
dialect "java" 
no-loop true
when
    $notification: NotificationVO(getFilteredMasterData()!=null,
                                  getFilteredMasterData().size()>3,
                                  getReasoningData().size()==0);
then
  System.out.println("Rule 3");
  modify($notification) {
    getReasoningData().put($notification.getFilteredMasterData().get(0)
 .getRodentWeight(),
                           $notification.getFilteredMasterData().get(0))
  }
end

你能告诉我出了什么问题吗?

这很简单:每当一个事实被修改时,所有引用该事实的规则都会被再次评估,如果条件为真,它们会导致另一个激活。

要打破这个恶性循环,您有多种选择,但在两个规则上都使用无循环不是其中之一。

首先,您可以添加事实数据中未给出其右侧建立的规则之一的条件。因此,当 Rule 1$masterData 添加到列表 filteredMasterData 时:添加此元素不在列表中的约束:

when
  $notification:NotificationVO( $fmd: filteredMasterData)
  $snrData : SensorDataVO(getOffsetChngesInterval()!=null,
                          getOffsetChngesInterval().size()>0)
  $pestWeight:Integer() from $snrData.getOffsetChngesInterval()
  $masterData: MasterDataVO($pestWeight==rodentWeight)
  eval( ! $fmd.contains( $masterData ) )
then

另一种可能性取决于使用在 Rule 2 中更新的 Map reasoningData。如果这 在任何条件下都没有使用 ,您可以简单地修改地图 而无需调用更新或修改 ,做(我所说的)一个 "dirty update"。