まずは一番簡単なサンプルプログラムから。
- プログラムの概要
- 名前と年齢を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;
}
}
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歳なのでお酒飲めません