使用 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"。
我在列表中得到不一致的数据,列表中的数据添加到规则 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"。