更新对象时是否会重新插入逻辑事实,但是该对象的更新字段不包含在添加事实的规则中?

时间:2017-09-12 03:34:56

标签: drools

我想知道的是Drools真值维护系统会重新插入逻辑事实(基本上用新对象更新现有的事实)当插入它的规则的一部分的对象被更改但没有规则中包含的字段是否已更改?

下面是一个显示我正在谈论的内容的示例。 可以说我们有以下两个类:

public class Class1{
    int x;
    int y;
    int z;
}
public class Class2{
    Class1 class1;
    int x;
    int y;
}
public class LogicalFact{
    Class2 class2;
}

还有下两个插入逻辑事实的示例规则,它是“LogicalFact”类中的对象:

rule "example1"
    when
        $class2 : Class2(x > 20)
    then
        insertLogical(new LogicalFact($class2));
end

rule "example2"
    when
        $class2 : Class2(class1.x > 10, x > 20)
    then
        insertLogical(new LogicalFact($class2));
end

假设更改了Class2对象(“class2”)中的y字段,并且Class2对象(“class2”)指向的Class1对象中的z字段也会更改。 在“example2”规则中,字段y中的更改和/或字段class1.z中的更改会以某种方式导致重新评估规则,并从头开始再次创建和插入逻辑事实,即使这些值未更改?它会在“example1”情况下有所不同,因为它只使用x,只有在Class2对象中的x被更改时才会被评估吗?

即使对于作为规则一部分的字段,边缘情况基本上也会再次设置相同的值,即使在这种情况下,它是否会再次插入逻辑事实?

如果再次从头开始插入逻辑事实,他们还会重新评估使用它们的规则,即使没有任何区别吗?

 /* Based on a "LogicalFact" object inserting a logical fact from the class 
 "AnotherLogicalFact". */

 rule "logical-fact-rule"
     when LogicalFact(...)
     then
         insertLogical(new AnotherLogicalFact());
 end

示例中的规则很简单,但它们可能会变得更加复杂,包括使用累积函数等。因此,重新评估规则基本上没有任何规则是一个代价高昂的过程。

如果规则所依据的值没有变化,那么所有这一切都得到了解决,基本上真相维护系统所做的就是坚持已经创建的逻辑事实。 我只是想征求意见。

如果事实证明这是真的,最好的方法是什么?

0 个答案:

没有答案