【问题标题】:Drools Expert output object in ScalaScala 中的 Drools Expert 输出对象
【发布时间】:2011-12-15 18:54:27
【问题描述】:

我是 Scala 和 Drools 专家的新手,需要一些帮助来从 Drools 会话中获取信息。我已经成功设置了一些由 Drools 规则操纵的 Scala 类。现在我想创建一个对象来存储一组输出事实,以便在 Drools 之外进行处理。这就是我所拥有的。

我有一个简单的对象,它存储了一个数字结果(在规则的 RHS 中生成)以及一个注释字符串:

class TestResults {
    val results = new MutableList[(Float, String)]()

    def add(cost: Float, comment: String) {
        results += Tuple2(cost, comment)
    }
}

在 DRL 文件中,我有以下内容:

import my.domain.app.TestResults

global TestResults results

rule "always"
    dialect "mvel"
    when
        //
    then
        System.out.println("75 (fixed)")
        results.add(75, "fixed")
end

当我运行包含此内容的代码时,我收到以下错误:

org.drools.runtime.rule.ConsequenceException: rule: always
    at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
...
Caused by: [Error: null pointer or function not found: add]
[Near : {... results.add(75, "fixed"); ....}]
                                                       ^
[Line: 2, Column: 9]
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:997)

在我看来,我在 Scala 中对 TestResults 对象的定义有些愚蠢,以至于 Drools 编译成的 Java 无法完全看到它。类型不匹配,也许?我想不通。有什么建议?谢谢!

【问题讨论】:

    标签: java scala drools


    【解决方案1】:

    试试

    import my.domain.app.TestResults
    
    global TestResults results
    
    rule "always"
        dialect "mvel"
        when
            //
        then
            System.out.println("75 (fixed)")
            results().add(75.0f, "fixed")
    end
    

    我的猜测是类型不对齐并且错误消息很差。 (75 是一个 Int,想要一个 Float)

    【讨论】:

    • 嗯,似乎没有帮助。我不确定你是否打算在那里有额外的 () 集,但如果你这样做,它甚至不会解析。没有,它仍然无济于事:引起:[错误:找不到空指针或函数:add] [Near : {... results.add(75.0f, "fixed"); ....}]
    【解决方案2】:

    您需要在执行会话之前初始化您的results 全局变量。您可以使用以下方法对其进行初始化:

    knowledgeSession.setGlobal("results", new TestResults()))
    

    【讨论】:

    • 是的,这就是我错过的步骤!错误消息具有误导性。为了完整起见,下面是有效的快速而肮脏的代码: val results = new TestResults(); ksession.setGlobal("结果", 结果); ksession.fireAllRules(); println(results.results.foldLeft(0.0f)((r,c) => r + c._1)) (可能我应该将该折叠放在结果对象的方法中......)
    • 你能在 FireAllRules 命令之后在控制台上打印出结果吗?我正在做同样的事情,除了没有错误,但我无法验证返回的内容....
    【解决方案3】:

    没错.. 并尝试在您的规则中添加一个条件,这样它就更有意义(when 部分)。 条件求值是规则引擎最重要的特性,写不带条件的规则意义不大。

    干杯

    【讨论】:

    • 不是答案,也没有帮助。我知道如何使用生产规则。
    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多