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

在drools excel描述表中声明对象

东门深
2023-03-14

我正在尝试使用Drools决策表。我面临的问题是drools没有为我的当前对象分配变量

我从口水中得到这个错误:

Drools错误:无法解决规则编译错误患者

我的excel文件如下所示:

我的部分实验室代码如下所示:

DecisionTableConfiguration dtconf = KnowledgeBuilderFactory.newDecisionTableConfiguration();
        dtconf.setInputType(DecisionTableInputType.XLS);
        dtconf.setWorksheetName("Sheet1"); 

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        Resource r = ResourceFactory.newClassPathResource("rules.xls");
        kbuilder.add(r, ResourceType.DTABLE, dtconf);

        SpreadsheetCompiler compiler = new SpreadsheetCompiler();
        String drl = compiler.compile(r.getInputStream(), InputType.XLS);

        System.out.println(drl);

        if(kbuilder.hasErrors()) {
            for(KnowledgeBuilderError err : kbuilder.getErrors()) {
                System.out.println("Drools error: " + err.getMessage());
            }
            model.addAttribute("droolErrors", kbuilder.getErrors());
            return "index";
        }

        KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
        knowledgeBase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
        StatefulKnowledgeSession dsess = knowledgeBase.newStatefulKnowledgeSession();

        for(Patient p : patients) {
            dsess.insert(p);
        }

        model.addAttribute("factCount", dsess.getFactCount());

        KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(dsess, "test"); 

        int res = dsess.fireAllRules();
        System.out.println(res);
        dsess.dispose();


        logger.close();

生成的drl如下所示:

package com.sorkmos.drools.domain;
//generated from Decision Table
import com.sorkmos.drools.domain.*;
// rule values at C11, header at C6
rule "Risks rules_11"
    when
        Patient(age == 75)
    then
        patient.setAge(22);
end


Drools error: Rule Compilation error patient cannot be resolved

很明显,我需要设置“patient”变量。但我不知道怎么做。正确的drl版本如下:

package com.sorkmos.drools.domain;
//generated from Decision Table
import com.sorkmos.drools.domain.*;
// rule values at C11, header at C6
rule "Risks rules_11"
    when
        Patient(age == 75);
        patient: Patient();
    then
        patient.setAge(22);
end

共有1个答案

龙嘉誉
2023-03-14

问题是从Cell C到G的病人模式没有定义任何变量。如果您确定要有2个单独的病人模式,那么您必须在那里绑定一个变量。当然,如果您绑定“病人”,那么请确保C到G和H列是排他的。否则您最终会得到重复的变量定义。根据我掌握的稀缺信息,我想你不希望有不同的病人模式。如果是这种情况,只需将单元格H8与[C-G] 8合并并确保值为病人:病人。

希望有帮助,

 类似资料:
  • 在现代界面定义部分比如 ; 安装界面包含的语言设置 !insertmacro MUI_LANGUAGE "SimpChinese" 下面添加以下代码: ;文件版本声明 VIProductVersion "1.2.0.0" VIAddVersionKey /LANG=2052 "ProductName" "轻狂E书制作工具包" VIAddVersionKey /LANG=2052 "Co

  • 三个常见的中断和异常来源: 异常 - sync; 软中断 - sync; 外部中断 - async。 异常的类型: 故障 - 在指令导致异常之前会被准确地报告。%rip保存的指针指向故障的指令; 陷阱 - 在指令导致异常之后会被准确地报告。%rip保存的指针同样指向故障的指令; 终止 - 是不明确的异常。 因为它们不能被明确,中止通常不允许程序可靠地再次启动。 只有当RFLAGS.IF = 1时,

  • TableSpec describeTable(String tableName) 功能 描述表,得到表的结构和元数据信息 方法参数 1.tableName : String : required 方法返回值 tableSpec : TableSpec 包括TableSchema和TableMeta两部分 TableSchema 1.entityGroupSpec, 表的实体组键 2.primar

  • 主要内容:对象表达式,对象声明,伴生对象,对象表达式和对象声明之间的语义差异Kotlin 用对象表达式和对象声明来实现创建一个对某个类做了轻微改动的类的对象,且不需要去声明一个新的子类。 对象表达式 通过对象表达式实现一个匿名内部类的对象用于方法的参数中: 对象可以继承于某个基类,或者实现其他接口: 如果超类型有一个构造函数,则必须传递参数给它。多个超类型和接口可以用逗号分隔。 通过对象表达式可以越过类的定义直接得到一个对象: 请注意,匿名对象可以用作只在本地和私有作用域

  • 一般来说,一个描述器是一个有“绑定行为”的对象属性 (object attribute),它的访问控制被描述器协议方法重写。 这些方法是 __get__(), __set__() , 和 __delete__() 。 有这些方法的对象叫做描述器。 默认对属性的访问控制是从对象的字典里面 (__dict__) 中获取 (get) , 设置 (set) 和删除 (delete) 。 举例来说, a.x

  • 概述 JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。 下面是属性描述对象的一个例子。 { value: 123, writable: false, enumerable: true,