Droolsでの後方連鎖の例

1概要

この記事では、Backward Chainingとは何か、そしてそれをDroolsでどのように使用できるかを説明します。

この記事はリンクを紹介するシリーズの一部です:/drools[Drools Business Rules Engine]。

2 Mavenの依存関係

drools-core 依存関係 をインポートすることから始めましょう:

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>7.4.1.Final</version>
</dependency>

3フォワードチェーン

まず最初に、フォワードチェーンでデータを分析し、特定の結論に向かって進みます。

順方向連鎖を適用する例は、ノード間の既知の接続を検査することによって新しい経路を発見するシステムです。

4後方チェーン

前方連鎖とは対照的に、後方連鎖は結論(仮説)から直接始まり、一連の事実を遡ってそれを検証します。

フォワードチェーンとバックワードチェーンを比較すると、最初のものは「データ駆動型」(入力としてのデータ)、後者は「イベント(またはゴール)駆動型」(ゴールとしての入力)と表現できます。 **

後方連鎖を適用する例としては、2つのノードを結ぶ経路があるかどうかを検証することが考えられます。

5 Drools Backward Chaining

Droolsプロジェクトは主にフォワードチェーンシステムとして作成されました。

しかし、バージョン5.2.0以降では、後方連鎖もサポートしています。

簡単なアプリケーションを作成し、簡単な仮説を検証してみましょう - 万里の長城が惑星の地球上にある場合 -

5.1. データ

物事とその場所を説明する簡単なファクトベースを作成しましょう。

  1. 地球

  2. アジア、惑星地球

  3. 中国、アジア

  4. 中国、グレートウォールオブチャイナ

5.2. ルールの定義

それでは、 BackwardChaining.drl という名前の「.drl」ファイルを作成しましょう。これを /resources/com/baeldung/drools/rules/ に配置します。これには、例で使用される必要なすべてのクエリとルールが含まれます。

後方連鎖を利用するメインの belongsTo クエリは、

query belongsTo(String x, String y)
    Fact(x, y;)
    or
    (Fact(z, y;) and belongsTo(x, z;))
end

さらに、結果を簡単に確認できるようにする2つのルールを追加しましょう。

rule "Great Wall of China BELONGS TO Planet Earth"
when
    belongsTo("Great Wall of China", "Planet Earth";)
then
    result.setValue("Decision one taken: Great Wall of China BELONGS TO Planet Earth");
end

rule "print all facts"
when
    belongsTo(element, place;)
then
    result.addFact(element + " IS ELEMENT OF " + place);
end

5.3. アプリケーションを作成する

それでは、事実を表現するためのJavaクラスが必要になります。

public class Fact {

    @Position(0)
    private String element;

    @Position(1)
    private String place;

   //getters, setters, constructors, and other methods ...
}

ここでは、 @ Position アノテーションを使用して、Droolsがこれらの属性に値を提供する順序をアプリケーションに指示します。

また、結果を表すPOJOを作成します。

public class Result {
    private String value;
    private List<String> facts = new ArrayList<>();

   //... getters, setters, constructors, and other methods
}

そして今、私たちは例を実行することができます:

public class BackwardChainingTest {

    @Before
    public void before() {
        result = new Result();
        ksession = new DroolsBeanFactory().getKieSession();
    }

    @Test
    public void whenWallOfChinaIsGiven__ThenItBelongsToPlanetEarth() {

        ksession.setGlobal("result", result);
        ksession.insert(new Fact("Asia", "Planet Earth"));
        ksession.insert(new Fact("China", "Asia"));
        ksession.insert(new Fact("Great Wall of China", "China"));

        ksession.fireAllRules();

        assertEquals(
          result.getValue(),
          "Decision one taken: Great Wall of China BELONGS TO Planet Earth");
    }
}

テストケースが実行されると、与えられた事実が追加されます(「アジアは惑星地球に属します」、「中国はアジアに属します」、「万里の長城は中国に属します」)。

その後、ファクトは BackwardChaining.drl で説明されている規則に従って処理され、再帰クエリ belongsTo(String x、String y). が提供されます。

この問い合わせは、仮説( 「万里の長城」の惑星地球 )が真か偽かを調べるために後方連鎖を使用する規則によって呼び出されます。

6. 結論

決定が正しいかどうかを検証するためにファクトのリストを取得するために使用されるDroolsの機能である、バックワードチェーンの概要を示しました。

いつものように、完全な例は私達のhttps://github.com/eugenp/tutorials/tree/master/drools[GitHub repository]にあります。