当前位置: 首页 > 知识库问答 >
问题:

在规则Drools的工作内存中修改/更新ArrayList中的元素

裴实
2023-03-14

我们正在制定一项规则,其结构如下:

  • 我们有一个包含已验证和未验证元素的列表。验证和未验证之间的区别是通过赋予元素不同的状态来实现的。
  • 我们从列表中获取未验证的元素。
  • 将每个未验证的元素与同一列表中的验证元素进行比较。
  • 比较后,未验证的元素将成为验证的元素,在验证未验证的元素时需要考虑。

当我们想要更新元素的原始ArrayList时,问题就出现了。我们需要能够在工作内存中的原始ArrayList中更新刚刚经过验证的未验证元素,以便循环可以考虑“刷新的”ArrayList。

三个问题:

首先,在Drools中使用modify和update的确切区别是什么。根据Drools文件:

“在规则的右侧,建议使用modifystatement,因为它在单个语句中进行更改并通知引擎。”

所以两者之间的区别只是简单的语义学,比如:

modify( $sprinkler ) { setOn( true ) };

$sprinkler.setOn(true);
update($sprinkler);

这个假设正确吗?

其次,是否可以在Drools中的工作内存中更新或修改ArrayList中的特定元素,而无需使用普通Java迭代器(“for”)。在我们的例子中,每个元素都使用我们从列表中获得的唯一ID来标识,因此我们将有一个有效的引用来更新其状态(已验证或未验证)。

最后,我们知道更新工作内存会导致规则再次触发。假设我们有一个包含两个未验证项的ArrayList。如果我们要获取所有未验证的项目来验证它们,我将创建一个规则“first”,该规则将触发两次,每个未验证的项目触发一次:

rule "first"
  when
    $listOfElements : java.util.ArrayList ( )
    $itemsToValidate : Element ( status == "not validated" ) from $listOfElements
  then 
    //do something or not
end

如果在第二条规则中,我将验证某些项目,并希望在工作内存中将未验证元素的状态更改为已验证,如下所示:

rule "second" extends "first"
  when
    //we validate attributes of the non-validated element against attributes of the validated elements
  then
    //my second question is if something like this is actually possible (solution without Java iterator)
    $itemsToValidate.setStatus("validated")
    modify ($listOfElements) { $itemsToValidate };
end

这将如何影响整个过程?工作记忆的实现将促使人们重新评估第一条规则。由于遇到了两个未验证的元素,此规则已经启动了两次。剩下的元素将只评估一次还是多次?

共有1个答案

俞子实
2023-03-14

第一个问题的答案是,这两个片段之间没有区别。(第二条中的两条之间插入的语句会影响我的回答。)

第二个问题的场景不使用相同形式的更新。将列表作为事实插入但对列表元素进行操作通常被认为是不好的。插入列表元素。容器作为将列表元素保存到一个事务或其他事务的容器可能有用,也可能不有用。

 类似资料:
  • 想想有没有一种方法可以使用Drools API将drl文件转换为excel工作表? 我们目前使用的是Drools 5.3,但实际上可以使用任何版本。 提前感谢

  • 问题内容: 在启动时如何从数据库表中加载规则并从Drools 6.2.0中的同一表中更新规则呢?我找到了一个使用Drools 5 的示例,我可能可以将它从Scala转换为Java,但看起来API发生了巨大变化……例如,我看不到RuleBaseFactory类。 任何样品或文件将不胜感激。 问题答案: 我不确定从哪儿拿来的。以下是在Drools 5.3(可能更早)至5.6中的完成方式: 省略号指示用

  • 任何关于这个或者如何使用drools api修改drools规则的想法都将是有用的。 注意:我不想为修改规则做字符串替换。

  • 在为我的项目实现了一些规则之后,我做了一个“ScoreConsistencyCheck”,以确保规则得到了正确的实现。 表示实现我自己的方法,该方法将在我提前终止求解或通过配置终止后调用,输出预期分数。该方法的参数是一个实例,基于解决方案的状态计算预期分数,然后将其与来自解决方案实例的“分数”变量的分数进行比较。 当我使用时,它不会抛出异常,但是当我这样尝试时,我有时会在构建启发式或本地搜索的特定

  • 请帮助我下面的代码,我得到相同的输出,即使改变值 值9未更新。

  • 我对口水和探索完全陌生。到目前为止,我一直在使用一个规则和withing,我们使用if条件,就像Java一样。 2.我会使用函数,我知道的是用java编写函数并导入它们。 3.是否有可能在Drools中创建函数,并像在Java中一样使用? 我并没有以它应该使用的方式使用Drools,但到目前为止,规则还没有我们现在使用的规则那么复杂。任何帮助对我都是有用的。