1

状況は簡単です。ルール ファイルを作成しました。

package org.domain.rules;
dialect "mvel"
import eu.ohim.fsp.core.configuration.domain.xsd.Section;

global java.lang.String sectionName;

rule "rule 1"
salience 1000
when
    Section($name : nameOfTheSection)
    eval(sectionName == null)
then
    System.out.println("Section: " + $name+ "("+$name.length()+")");
    System.out.println("Section Name: " + sectionName + "("+sectionName.length()+")");
    System.out.println("Mark Details: " + sectionName.equals(null));
end

ルールを実行する前に、セクション オブジェクトに有効なcoreNameグローバルオブジェクトを追加しました。

public void fireInserted(Section section1) {
    kstateful.insert(section1);
    kstateful.setGlobal("sectionName", new String("markudetails"));
    kstateful.fireAllRules();
}

結果は次のとおりです。

Section: markudetails(12)
Section Name: markudetails(12)
Mark Details: false

質問: どうすればそれが可能になりますか? 部分がnullの場合、および部分がnullでない場合!!!

4

1 に答える 1

6

グローバル変数はナレッジ ベースの一部ではありませんが、ルールの実行にコンテキストをプッシュする別のチャネルです。whenそれらを句で使用することは適切ではありません。nullルールのアクティブ化はルールの実行から完全に切り離されているため、あなたの場合の正確な理由を追跡するのは難しいかもしれません。変数は、when句の評価時にバインドされない場合がありますが、then句の実行時にバインドされます。

要約すると、when句でグローバルを使用しないでください。それはその目的ではありません。

問題には簡単な一般的な解決策があります。構成オブジェクトを知識に挿入できます。そのオブジェクトには、目的の「sectionName」プロパティを含めることができ、when.

余談ですが、これをテストしても意味object.equals(null)がありませんtrue。使用する必要もありませんnew String("markudetails")。代わりに just を使用し"markudetails"ます。

于 2012-06-27T10:30:34.163 に答える