質問

私が現在取り組んでいるアプリケーションでは、何らかのサービスのために何万ものオブジェクトの適格性を定期的に確認する必要があります。決定図自体は次の形式で、はるかに大きくなります。 Decision diagram

各エンドノード(円)では、アクションを実行する必要があります(オブジェクトのフィールド、ログ情報など)。 Drool Expert Frameworkを使用しようとしましたが、その場合、エンドノードにつながる図内のすべてのパスに対して長いルールを作成する必要があります。 Drools Flowはそのようなユースケースのために構築されていないようです。私はオブジェクトを取ります。その後、途中で決定に応じて、最終ノードの1つになります。そして、別のオブジェクトのために再び。またはそれは?そのようなソリューションへのいくつかの例/リンクを教えてください。

アップデート:

よだれの流れの呼び出しは次のようになるかもしれません:

// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();

for(int i = 0; i < 10000; i++) {

    Application app = somehowGetAppById(i);

    // insert app into working memory
    FactHandle appHandle = ksession.insert(app);

    // app variable for action nodes
    params.put("app", app);

    // start a new process instance
    ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
    while(true) {
        if(instance.getState() == instance.STATE_COMPLETED) {
            break;
        }
    }

  // remove object from working memory
    ksession.retract(appHandle);
}

つまり、アプリケーションオブジェクトを取得し、新しいプロセスを開始します。プロセスが終了したら(最終的なアクションノードがアプリケーションを何らかの形で変更します)、ワーキングメモリからオブジェクトを削除し、プロセスを繰り返します新しいアプリオブジェクト。このソリューションについてどう思いますか?

解決:
Drools Flowを使用することになりましたが、非常にうまく機能しています。私の決定プロセスは、Droolsの専門家が決定ツリーのどこに要求するか、データベースからオブジェクトのリストをロードし、それらを変換し、決定を下し、すべてを記録するなどのプロセスを求めるほど簡単ではありません。プロセスオブジェクトを使用します。これはパラメーターとしてプロセスに渡され、すべてのグローバル変数(プロセス用)と、ツリー内のさまざまなポイントで繰り返される便利な方法( Script Task ノードはそれ自体があまり便利ではありません)。私はまた、Javaを使用して決定を下すことになりました(そしてそうではありません mvel またはルール) - それはより速く、私は制御しやすいと言います。私が操作するすべてのオブジェクトは、パラメーターとして渡され、コード内の通常のJava変数として使用されます。

役に立ちましたか?

解決

よだれの専門家 間違いなく行く方法です。

より高いノードのために自分自身を繰り返すことを避けたい場合は、トリックは使用することです insertLogical (あるいは単に insert ステートレスセッションに参加している場合)そして、ルールがルールをトリガーできることを理解するために(父親のSQLクエリではありません)。例えば:

// we just insert Customer objects in the WM

rule "evaluateRetired"
when
    $c : Customer(age > 65)
then
    insertLogical(new Retiree($c));
end

rule "evaluteRetireeIsFemale"
when
    $r : Retiree(customer.gender == Gender.FEMALE, $c : customer)
then
    ...
end

決定図が頻繁に変更された場合(および非プログラマーに編集する必要があります)、のドキュメントを見てください 決定表 (と DSL)。その場合、おそらく各ルールのパス全体を繰り返しますが、ほとんどの場合、それは実際には問題ありません。

他のヒント

同様の問題があり、Neo4Jノードデータベースをシンプルで非常に柔軟なルールエンジンとして使用しました。レストサービスインターフェイスで使用できるので、メインアプリケーションから独立しています。また、ルールを構成するための個別のアプリケーションを持つこともできます(エンドユーザーであっても)。

ILOG Framework Cum Rules Engineを試すことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top