2013/08/08

Drools Expert 6.0 beta 試玩

前言
最近可能會接觸expert system,經過一些study,焦點放在三個
參考了一些評比
  • http://illation.com/banking-benchmark-performance-jess-vs-drools/
  • http://www.integratingstuff.com/2010/07/18/rule-engines-in-java-jboss-drools/
由於Drools是open source,且效能並不遜於其他兩個商業軟體,所以就先從Drools開始玩起了

下載與安裝
Drools的下載頁 http://www.jboss.org/drools/downloads
由於目標是在Drools Expert上,依據description的描述,就下載Drools。我下載的是6.0.0 beta 5,大小約114M。6.0版與前版之差別可以參考這裡。解開壓縮檔後,裡面包含開發所需要的jar files, 還有原始碼、javadoc、參考文件與範例等。
如果要安裝eclipse的plug-in,

  1. 參考http://docs.jboss.org/drools/release/5.5.0.Final/droolsjbpm-introduction-docs/html_single/index.html#d0e95,先以2.1.3.1方式安裝GEF
  2. 安裝Drools plug-in:以eclipse的 Help | Install New Software,在Location輸入 http://download.jboss.org/drools/release/6.0.0.Beta5/org.drools.updatesite 來進行安裝。(或是先用瀏覽器到http://download.jboss.org/drools/release去尋找相對應的版本目錄)
  3. 在 http://www.jboss.org/drools/downloads.html 下載  Drools and jBPM tools,解壓縮至硬碟
  4. 再以1.中文件 2.1.3.4 所述方法,設定 drools runtime
程式開發
接下來我們來進行程式的開發。先在eclipse中建立新的專案,記得在專案的properties之Java Build Path裡,新增一個library,把上圖中binaries下所有的jar files都加進來。

首先我們來撰寫rule的部份:
colorRule.drl 

rule "red"
when
color:Color(color=='red')
then
System.out.println("#ff0000");
end

rule "green"
when
color:Color(color=='green')
then
System.out.println("#00ff00");
end

rule "blue"
when
color:Color(color=='blue')
then
System.out.println("#0000ff");
end
這裡我們定義了三個rule,讓三種顏色的名稱對應到其color code。

接下來Java來開發程式。首先需要一個entity object

Color.java

public class Color {
private String color;

public Color(){}
public Color(String color) {
this.color = color;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}
}
然後再一個帶有main()的可執行程式
DrColor.java

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.compiler.compiler.DroolsError;
import org.drools.compiler.compiler.DroolsParserException;
import org.drools.compiler.compiler.PackageBuilder;
import org.drools.compiler.compiler.PackageBuilderErrors;
import org.drools.core.RuleBase;
import org.drools.core.RuleBaseFactory;
import org.drools.core.StatefulSession;


public class DrColor {
private RuleBase rbase = RuleBaseFactory.newRuleBase();
private PackageBuilder pbuilder = new PackageBuilder();
private String DRL_FILE = "colorRule.drl";

private void initDrools() {
// read DRL file and add to package builder
try {
Reader reader = new InputStreamReader(DrColor.class.getResourceAsStream(DRL_FILE));
pbuilder.addPackageFromDrl(reader);
} catch (DroolsParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

PackageBuilderErrors errors = pbuilder.getErrors();
if (errors.getErrors().length > 0) {
System.out.println("ERROR:");
for (DroolsError err: errors.getErrors()) {
System.out.println(err);
}
throw new IllegalArgumentException("Could not parse knowledge");
}

// add package to rule base
rbase.addPackage(pbuilder.getPackage());
}

private void determineColor(String col) {
Color c = new Color(col);
StatefulSession session = rbase.newStatefulSession();
session.insert(c);
session.fireAllRules();
}

public static void main(String[] args) {
DrColor m = new DrColor();
m.initDrools();
m.determineColor("blue");
m.determineColor("red");
}
}

當執行時,若能看到#0000ff與#ff0000,就表示Drools Expert可以正常執行了。
接下來,就要由你來發揮想像力,讓這專家系統發揮效力了。

參考文件:
Drools Expert User Guide 6.0 beta
Drools Documents

沒有留言: