0

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

「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
4

1 に答える 1

0

問題は、CellCからGに移動するPatientパターンが変数を定義していないことです。2つの別々の患者パターンが必要な場合は、そこに変数をバインドする必要があります。もちろん、「patient」をバインドする場合は、列CからGおよびHが排他的であることを確認してください。そうしないと、変数定義が重複してしまいます。私が持っている乏しい情報によると、私はあなたが異なる患者のパターンを持っている必要はないと思います。その場合は、セルH8を[CG] 8とマージし、値がpatient:Patientであることを確認してください。

それが役に立てば幸い、

于 2013-03-17T15:50:44.023 に答える