2013-03-16 1 views
0

Drools 의사 결정 테이블을 사용하려고합니다. 내가 직면하고있는 문제는 drools이 현재 개체에 대한 변수를 할당하지 않는다는 것입니다.drools의 객체 선언은 descision 테이블을 능가합니다.

내가이 샘이 오류를 얻을 :

Drools error: Rule Compilation error patient cannot be resolved

내 파일은 다음과 같습니다 엑셀 :

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

문제는 G에 셀 C에서가는 환자 패턴이 어떤 변수를 정의하지 않는다는 것이다. 2 개의 분리 된 환자 패턴을 원한다면 변수를 거기에 바인딩해야합니다. 물론 '환자'를 바인딩하는 경우 C와 G 및 H 열이 배타적인지 확인하십시오. 그렇지 않으면 중복 된 변수 정의로 끝납니다. 내가 가진 부족한 정보에 따르면, 당신은 다른 환자 패턴을 갖고 싶지 않다고 생각합니다. 이 경우 셀 H8을 [C-G] 8과 병합하고 값이 patient : Patient인지 확인하십시오.

희망,

+0

예, 나는 C-H를 병합하여 환자 : 환자에게 변수를 설정했습니다. 감사! – heldt

관련 문제