9

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

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

アップデート:

Drools Flowの呼び出しは、次のようになります。

// 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);
}

つまり、アプリケーションオブジェクトを取得し、そのための新しいプロセスを開始します。プロセスが終了したら(最後のアクションノードはアプリケーションを何らかの方法で変更します)、作業メモリからオブジェクトを削除し、次のプロセスを繰り返します。新しいAppオブジェクト。このソリューションについてどう思いますか?

解決策:
Drools Flowを使用することになり、非常に正常に機能しています。私の意思決定プロセスは、Drools Expertが要求するほど単純ではなく、意思決定ツリーのどこにあるかによって、データベースからオブジェクトのリストをロードし、変換し、意思決定を行い、すべてをログに記録する必要があります。私はProcessオブジェクトを使用します。これはパラメーターとしてプロセスに渡され、すべてのグローバル変数(プロセス用)と、ツリー内のさまざまなポイントで繰り返されるいくつかの便利なメソッドを格納します(Script TaskノードでのJavaコードの記述自体はあまり便利ではないため)。また、Javaを使用して意思決定を行うことになりました(mvelルールではありません)。Javaの方が高速で、制御が簡単だと思います。私が使用するすべてのオブジェクトはパラメーターとして渡され、コード内で通常のJava変数として使用されます。

4

3 に答える 3

12

Droolsの専門家は間違いなく行く方法です。

上位ノードで自分自身を繰り返さないようにしたい場合は、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)のドキュメントを参照してください。その場合、ルールごとにパス全体を繰り返すことになるでしょうが、ほとんどの場合、実際には問題ありません。

于 2011-02-03T15:33:53.503 に答える
0

iLogフレームワーク兼ルールエンジンを試すことができます。

于 2011-02-03T15:12:34.833 に答える
0

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

于 2014-05-26T12:35:20.517 に答える