1. 概要

この記事では、後向き連鎖とは何か、そしてそれをDroolsでどのように使用できるかを見ていきます。

この記事は、 Drools Business RulesEngineを紹介するシリーズの一部です。

2. Mavenの依存関係

drools-coredependentencyをインポートすることから始めましょう。

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

3. 前向き連鎖

まず、前向き連鎖では、データを分析することから始めて、特定の結論に向かって進みます。

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

4. 後向き連鎖

前向き連鎖とは対照的に、後向き連鎖は結論(仮説)から直接始まり、一連の事実をバックトラックすることによってそれを検証します。

前向き連鎖と後向き連鎖を比較すると、前者は「データ駆動型」(入力としてのデータ)と表現でき、後者は「イベント(または目標)駆動型」(入力としての目標)と表現できます。 )。

後向き連鎖を適用する例は、2つのノードを接続するルートがあるかどうかを検証することです。

5. Drools後向き連鎖

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 、再帰クエリを提供します所属するTo(文字列x、文字列y)。

このクエリは、仮説(「万里の長城が惑星地球に属する」)が真であるか偽であるかを見つけるために後向き連鎖を使用するルールによって呼び出されます。

6. 結論

決定が真であるかどうかを検証するためにファクトのリストを取得するために使用されるDroolsの機能である後向き連鎖の概要を示しました。

いつものように、完全な例はGitHubリポジトリにあります。