2013-03-16 42 views
0

我试图使用Drools的决策表。 我现在面临的问题是,滴料不会与当前对象变量赋值给我。申报对象练成descision表

我得到这个错误从滴料:

Drools error: Rule Compilation error patient cannot be resolved

我的excel文件看起来是这样的:

enter image description here

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

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 

回答

0

的问题是,从小区C进行到G中的病人图案没有定义任何变量。如果你确定你想要有2个独立的Patient模式,那么你必须在那里绑定一个变量。当然,如果你绑定'耐心',那么确保列C到G和H是排他性的。否则,你将最终得到重复的变量定义。 根据我有稀缺的信息,我想你不希望有不同的患者的图案。如果是这种情况,只需将单元格H8与[C-G] 8合并,并确保该值是耐心的:患者。

希望它有帮助,

+0

是的,我合并了C-H并将该变量设置为患者:患者。谢谢! – heldt 2013-03-18 08:52:35