在drools excel决策表中声明对象
Posted
技术标签:
【中文标题】在drools excel决策表中声明对象【英文标题】:Declaring object in drools excel descision table 【发布时间】:2013-03-05 06:16:47 【问题描述】:我正在尝试使用 Drools 决策表。 我面临的问题是,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
很明显我需要设置“患者”变量。但我不知道怎么做。 一个正确的 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】:问题是从 Cell C 到 G 的 Patient 模式没有定义任何变量。如果您确定要拥有 2 个单独的 Patient 模式,那么您必须在那里绑定一个变量。当然,如果您绑定“患者”,请确保列 C 到 G 和 H 是互斥的。否则,您将得到重复的变量定义。 根据我所掌握的稀缺信息,我猜你不想拥有不同的患者模式。如果是这种情况,只需将单元格 H8 与 [C-G]8 合并并确保值为患者:患者。
希望对你有帮助,
【讨论】:
是的,我合并了 C-H 并将变量设置为患者:患者。谢谢!以上是关于在drools excel决策表中声明对象的主要内容,如果未能解决你的问题,请参考以下文章