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

Drools查询。它们是如何评估和执行的?

史骏
2023-03-14

我在概念验证应用程序中评估Drools6。我要么误解了Drools中的查询是如何工作的,要么我没有正确地实现某些东西。谁能给我解释一下这种行为:

rule "Patient Intake: Valid new Patients without a Medical History require a Review"
    ruleflow-group "Patient Intake"
    when
        $patient : Patient( status == PatientStatus.NEW )
        not Invalid( value == $patient )
    then
        modify( $patient ){
            setStatus( PatientStatus.PENDING_REVIEW )
        };

        insert( new Valid( $patient ) );
    end

query "Intake Results"
    Valid( $patients : value )
end

valid/invalid对象的使用方式与使用trait类似,但是文档表明trait特性仍然是实验性的/可能会改变,所以我暂时选择了这个替代方案。我认为这个问题很简单。我正在使用无状态会话,并像调用决策服务一样调用引擎。下面的代码片段显示了如何调用引擎(目前有些值是硬编码的):

StatelessKieSession kSession = kContainer.newStatelessKieSession( "TestKSession" );
KieRuntimeLogger auditLog = KieServices.Factory.get().getLoggers().newFileLogger( kSession, "audit" );
kSession.setGlobal( "logger", logger );

List<Command> commands = new ArrayList<Command>();
commands.add( CommandFactory.newInsertElements( request.getAllFacts() ) );
commands.add( CommandFactory.newQuery( "$patients", "Intake Results" ) );
commands.add( CommandFactory.newStartProcess( "x.y.z.intake" );

ExecutionResults results = kSession.execute( CommandFactory.newBatchExecution( commands ) );
auditLog.close();

我这样处理结果:

    private void processResults( ExecutionResults results ) {
        QueryResults qr = (QueryResults) results.getValue( "$patients" );
        for ( QueryResultsRow row : qr ) {
            // ... this code is never executed
        }
}

控制台中,我看到println语句,QueryResult大小为0。但是,如果我将查询更改为只collect$patterns:Object(),则QueryResult大小是通过CommandFactory插入的对象数,并且不包括作为规则RHS的一部分插入的对象。当我检查审核日志时,我看到确实插入了Valid类型的对象。

为什么我的查询没有返回预期的结果?是我实现了错误的东西,还是我只是误解了查询的工作方式?

谢谢,詹姆斯

共有1个答案

柯新翰
2023-03-14

命令的添加顺序很重要。添加查询命令是向引擎发出执行该查询的信号,因此在进程启动之前插入事实并运行查询。

关键是将添加查询和开始处理的行反转。现在应改为:

List<Command> commands = new ArrayList<Command>();
commands.add( CommandFactory.newInsertElements( request.getAllFacts() ) );
commands.add( CommandFactory.newStartProcess( "x.y.z.intake" );
commands.add( CommandFactory.newQuery( "$patients", "Intake Results" ) );
 类似资料:
  • 我知道Drools中的“显着性”提供了对规则执行顺序的控制。但上面是一个例子,说明了当“显着性”不再能帮助我时所面临的问题。 在这里,我有三条规则正在相继执行: 我期望第三条规则被触发,并且控制台中有“规则被触发”行,但它没有被执行。 据我所知,问题在于规则评估阶段,当所有三个规则在执行前同时评估,然后才根据它们的“显着性”回合执行。 在评估的那一刻,$resource1.amount是5,这就是

  • 我正在使用Spring WebFlow 2.5.0,但是我的SpEL表达式没有得到正确的计算。我想我一定是做了什么与我的WebFlow配置或SpEL错误,但我不确定哪个。 我的登录流中有以下决策状态。xml: 但是,即使我的方法返回一个Event.success(),我也从未转换到状态。测试结果似乎总是错误的。 是我的SpEL错了,还是我做评估/测试的方式错了?如何调试SpEL评估以查看发生了什么

  • 评估可能的员工,却没有得到它应得的能量。一个糟糕的雇佣,就像糟糕的婚姻,是非常糟糕的。每个人首要的一部分精力应该投入到招聘上,尽管这很少发生。 有不同的面试风格。有的是折磨人的,设计用来把候选人放在巨大压力下。这是为了这样一个有用的目的:在压力下折射出性格缺陷和弱点。候选人对待面试官不会比对待他们自己更诚实,而且,人的自欺能力是令人惊奇的。 你应当,最少,对候选人进行两个小时的与口头考核等价的技术

  • 我已经设置了一个Gradle任务来自动生成Gradle构建中的一个子项目,另一个子项目依赖于该子项目(这样做的原因:涉及Apache Cordova的故事很长!)。因此,根构建。gradle包含此自动生成任务,该任务创建“CordovaLib”子项目。构建。另一个子项目(非自动生成)中的gradle依赖于CordovaLib: 有没有办法在评估未生成的子项目的build.gradle之前执行自动生

  • 问题内容: 我如何创建一些简单的ajax评级,如本页http://watir.com/documentation/所示?每个访问者都应该能够评分,我不需要设置权限。我想将评级存储在列中。因此,用户可以按评分排序。请举一个详细的例子。我不是JavaScript专家。 我找到了一个从头开始创建评分的示例。但是它授权用户。有人可以向我显示创建没有评分者(用户)的评分的指南吗?它不仅应存储值,还应计算票数

  • 我理解经典例子的问题 但我无法说服自己以下是有效的还是无效的 我知道'foo(i)'和'i'的求值顺序是不确定的,但是'评估'到底是什么意思?也就是说bar的第二个参数总是42,或者'i'的当前值可以在foo改变它之前被传入吗?