1

JBoss Drools を使用しています。以下に定義するビジネス要件があります。JBoss Drools DRL 形式に変換したいと考えています。

ビジネス要件: 2 組の場所があります。1 つは、ユーザーが以前に訪れた場所です。これを X と呼びましょう。この情報は実行時に取得されます。そして、私はいくつかの場所のセットを持ち、それを Y と呼びましょう。この場所: Y は、Y が静的であることを意味するルールで事前定義されています。X のいずれかの場所が Y のいずれかの場所と一致する場合、何らかの Java コードを呼び出す必要があるという規則が必要です。

アルゴリズムの観点から

rule "Check if Locations X matches with Locations Y"

      When
         X: It Contains locations visted by user previosuly (obtained at runtime)
         Y: It contains some predefined locations
         Check if any location in x matches with any location in Y
     then
         call some java code here to process this.

end;

では、上記のルールを JBoss-Drools DRL 流に表現するにはどうすればよいでしょうか? この点に関するヘルプは本当に感謝しています。

4

1 に答える 1

2

わかりました、あなたの説明に基づいて試してみる準備ができました。これがあなたが探していたものではない場合は、より適切なソリューションに向けて取り組むことができます. また、地理の私の限られたコマンドを許してください;)。

まず、データ モデルを定義します。場所をモデル化する次のファクト クラスがあります。

package de.jannik.locationrules;

public class VisitedLocation {

    private String name;

    public VisitedLocation(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

次に、ユーザーをモデル化するクラスがあります。これは、呼び出したいメソッドにのみ必要です。

package de.jannik.locationrules;

public class User {
    public void handleVisitedContinent(String continentName) {
        System.out.println("User has been to " + continentName + ".");
    }
}

これで、これらのモデル クラスの観点からビジネス要件を説明できます。

package de.jannik.drltest

import de.jannik.locationrules.VisitedLocation;
import de.jannik.locationrules.User;

global User user;

rule "User has been to Europe"

    when
        exists VisitedLocation(name in ("Berlin", "Paris", "London", "Rome"))
    then
        user.handleVisitedContinent("Europe");
end

rule "User has been to Australia"

    when
        exists VisitedLocation(name in ("Melbourne", "Sydney"))
    then
        user.handleVisitedContinent("Australia");
end

rule "User has been to America"

    when
        exists VisitedLocation(name in ("San Francisco", "New York", "Buenos Aires"))
    then
        user.handleVisitedContinent("America");
end

ここでは、作業メモリに存在する sUser.handleVisitedContent(String)に応じて異なる引数でメソッドを呼び出すいくつかのルールを定式化しました。VisitedLocationファクトではユーザーが明示的にモデル化されていないことに注意してください。代わりに、ユーザーの変更が必要になるたびに新しいセッションが作成されると想定しています。ビジネス要件とパフォーマンスの考慮事項に応じて、これを変更して、すべてのユーザーに対して単一のセッションのみを使用することができます。

定義したルールを実行するために使用するコードは次のとおりです。

...
@Test
public void testLocationRules() {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("locations.drl"), ResourceType.DRL);
    if (kbuilder.hasErrors()) {
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        System.out.println(errors.toString());
        throw new RuntimeException(errors.toString());
    }
    KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
    knowledgeBase.addKnowledgePackages(kbuilder.getKnowledgePackages());
    StatelessKnowledgeSession session = knowledgeBase.newStatelessKnowledgeSession();
    session.setGlobal("user", new User());
    List<VisitedLocation> facts = new ArrayList<VisitedLocation>();
    facts.add(new VisitedLocation("Berlin"));
    facts.add(new VisitedLocation("Paris"));
    facts.add(new VisitedLocation("San Francisco"));
    facts.add(new VisitedLocation("Saigon"));
    session.execute(facts);
}
...

これにより、次の出力が得られます。

User has been to America.
User has been to Europe.

これがあなたが探していたものではない場合、またはさらに明確にする必要がある場合はお知らせください。また、Drools の概念の詳細については、 Drools Expert User Guideを参照してください。

于 2013-01-16T10:27:42.327 に答える