drools サンプルプログラム1

まずは一番簡単なサンプルプログラムから。

  • プログラムの概要
    • 名前と年齢をFactとしてルールエンジンに提供することにより、お酒が飲めるか飲めないかを判定するプログラムです。
  • Factの定義
    • POJOで記述します。Factと難しく言っていますがただの箱だと思ってください。最低限必要なものとしてはルール側でデータを取得するためのgetterが必要です。
public class Profile {

	private int age;

	private String name;

	public Profile(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public String getName() {
		return name;
	}
}

  • DrinkTest.java
    • 実行クラスです。
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

public class DrinkTest {

	public static final void main(String[] args) {
		try {
			// drl読み込み
			KnowledgeBase kbase = readKnowledgeBase();
			StatefulKnowledgeSession ksession = kbase
					.newStatefulKnowledgeSession();
			KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory
					.newFileLogger(ksession, "test");
			// ルールを実行
			ksession.insert(new Profile("uzr",31));
			ksession.fireAllRules();
			
			ksession.insert(new Profile("hoge",19));
			ksession.fireAllRules();
			
			logger.close();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private static KnowledgeBase readKnowledgeBase() throws Exception {
		
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
				.newKnowledgeBuilder();
		
		kbuilder.add(ResourceFactory.newClassPathResource("Drink.drl"),
				ResourceType.DRL);
		
		KnowledgeBuilderErrors errors = kbuilder.getErrors();
		if (errors.size() > 0) {
			for (KnowledgeBuilderError error : errors) {
				System.err.println(error);
			}
			throw new IllegalArgumentException("Could not parse knowledge.");
		}
		
		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
		kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
		
		return kbase;
	}
}

  • Drink.dsl
    • a,nはageの別名の定義を行っているだけです。Javaがわかる人ならなんとなくで書けそうな感じでした。ルール名に日本語が利用できるのが独特ですね。
rule "お酒飲めるルール"
	when
			ProfileFact(a:age>=20, n:name)
	then
		System.out.println( n + "さんは、" + a + "歳なのでお酒飲めます。"); 
end

rule "お酒飲めないルール"
    when
            ProfileFact(a:age<20, n:name)
    then
        System.out.println( n + "さんは、" + a + "歳なのでお酒飲めません"); 
end

  • 実行結果
uzrさんは、31歳なのでお酒飲めます。
hogeさんは、19歳なのでお酒飲めません