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

Drools 当对象更新时,逻辑事实是否会重新插入,但添加该事实的规则中不包括该对象中更新的字段?,drools,Drools,我想知道的是,当作为插入逻辑事实的规则的一部分的对象发生更改,但规则中包含的字段均未更改时,Drools真理维护系统是否会重新插入逻辑事实(基本上使用新对象更新现有事实) 下面是一个例子来说明我在说什么。 假设我们有以下两个类: public class Class1{ int x; int y; int z; } public class Class2{ Class1 class1; int x; int y; } public class Lo

我想知道的是,当作为插入逻辑事实的规则的一部分的对象发生更改,但规则中包含的字段均未更改时,Drools真理维护系统是否会重新插入逻辑事实(基本上使用新对象更新现有事实)

下面是一个例子来说明我在说什么。 假设我们有以下两个类:

public class Class1{
    int x;
    int y;
    int z;
}
public class Class2{
    Class1 class1;
    int x;
    int y;
}
public class LogicalFact{
    Class2 class2;
}
接下来的两个示例规则插入了一个逻辑事实,它是“LogicalAct”类中的一个对象:

假设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
示例中的规则很简单,但可能会变得更复杂,包括使用累积函数等。因此,重新评估规则基本上是免费的,这将是一个代价高昂的过程

也许这就是所有这些都被处理好了,基本上,真相维护系统所做的就是,如果规则所基于的值没有变化,就坚持已经创建的逻辑事实。 我只是想征求你的意见


如果这是真的,那么最好的方法是什么?

你必须将两件事分开。在某些RHS上插入的逻辑事实存在,而某些LHS侧为真。重新评估LHS的方式和原因以及从false到true再到false的变化取决于发动机对变化的反应方式。简单的回答是,对LHS中使用的某些事实进行了修改/更新,但也有“属性反应”功能-因此请仔细阅读小字。谢谢@laune。好吧,“财产反应”绝对是我想知道的。不幸的是,我正在使用OptaPlanner,目前不支持使用此功能。这是我在他们的问题跟踪网站上找到的一个JIRA,用于实现此功能。所以我想我现在应该做更重要的事情,等这件事实现,然后调整我的规则。你必须把两件事分开。在某些RHS上插入的逻辑事实存在,而某些LHS侧为真。重新评估LHS的方式和原因以及从false到true再到false的变化取决于发动机对变化的反应方式。简单的回答是,对LHS中使用的某些事实进行了修改/更新,但也有“属性反应”功能-因此请仔细阅读小字。谢谢@laune。好吧,“财产反应”绝对是我想知道的。不幸的是,我正在使用OptaPlanner,目前不支持使用此功能。这是我在他们的问题跟踪网站上找到的一个JIRA,用于实现此功能。所以我想我现在应该做更重要的事情,等待这一点得到实施,然后调整我的规则。
 /* Based on a "LogicalFact" object inserting a logical fact from the class 
 "AnotherLogicalFact". */

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