??xml version="1.0" encoding="utf-8" standalone="yes"?>四虎在线免费观看,中文字幕视频在线免费,巨人精品**http://www.aygfsteel.com/apple0668/category/43619.html上善若水Q水善利万物而不争,处众Z所恶而不争,故几于道——《老子?/description>zh-cnSun, 17 Jan 2010 13:29:04 GMTSun, 17 Jan 2010 13:29:04 GMT60Drools语法详解<?gt;http://www.aygfsteel.com/apple0668/archive/2010/01/17/309884.htmlapple0668apple0668Sun, 17 Jan 2010 13:11:00 GMThttp://www.aygfsteel.com/apple0668/archive/2010/01/17/309884.htmlhttp://www.aygfsteel.com/apple0668/comments/309884.htmlhttp://www.aygfsteel.com/apple0668/archive/2010/01/17/309884.html#Feedback0http://www.aygfsteel.com/apple0668/comments/commentRss/309884.htmlhttp://www.aygfsteel.com/apple0668/services/trackbacks/309884.html原文Q?font style="background-color: #cce8cf">http://www.javaeye.com/topic/190294
一个典型的DRL文gQ?
Java代码
①package com.sample   //包名Q不可以与关键字冲突  
②import com.sample.DroolsTest.Message;//本文仉要导入的c?nbsp; 
③global java.util.List myGlobalList;//全局变量  
?/定义函数?nbsp; 
function String hello(String name) {  
    return "Hello "+name+"!";  
}  
 
⑤rule "myRule"    
no-loop true  //执行一ơ后Q是否能被再ơ激z?nbsp; 
salience 100  //优先U别  
⑥when    
m : Message( status == Message.HELLO, message : message )   
⑦then      
m.setMessage( "Goodbye cruel world" );  
        m.setStatus( Message.GOODBYE );  
        update( m );  
    myGlobalList.add( "Hello World" );//使用global 变量  
    System.out.println( hello( "Bob" ) );//调用定义函数  
End 

①package com.sample   //包名Q不可以与关键字冲突
②import com.sample.DroolsTest.Message;//本文仉要导入的c?br /> ③global java.util.List myGlobalList;//全局变量
?/定义函数?br /> function String hello(String name) {
    return "Hello "+name+"!";
}

⑤rule "myRule" 
no-loop true  //执行一ơ后Q是否能被再ơ激z?br /> salience 100  //优先U别
⑥when 
m : Message( status == Message.HELLO, message : message )
⑦then   
m.setMessage( "Goodbye cruel world" );
  m.setStatus( Message.GOODBYE );
  update( m );
    myGlobalList.add( "Hello World" );//使用global 变量
    System.out.println( hello( "Bob" ) );//调用定义函数
End

 

①package com.sample
包名Q不可以与关键字冲突。一个包通过名称I间描绘Q这样很好的保持了一l规则的独立性?
②import
标记像java中的含义一栗对于Q何要用在规则中的对象Q你需要指定完整的路径和类型名。Drools从同名的java包中自动导入cR?
③global
如果多个包定义了同样名称的全局变量Q它们必M用同LcdQƈ且全部指向同一个全局倹{全部变量通常用来q回数据Q获得提供数据或服务l规则用。ؓ了用全局变量Q你必须Q?
在规则文件中声明全局变量q用它Q如Q?
global java.util.List myGlobalList;
rule "Using a global"
when
    eval( true )
then
    myGlobalList.add( "Hello World" );
end
在working memory上设|全局变量的倹{最好是在将fact插入working memory之前讄完所有全局变量Q如Q?
List list = new ArrayList();
WorkingMemory wm = rulebase.newStatefulSession();
wm.setGlobal( "myGlobalList", list );
④function
相对于正常的javac,函数是在你的规则代码中放|语a代码的方法。它们不可能做Q何超q你可以在帮助类Q在java中定义,被设|入规则的Working Memory中的c)中做到的事情。用函数的优点是可以将逻辑保存在一个地方,q且你可以在需要的时候改变函敎ͼq样做各有优~点Q。函数最大的用处是被规则的推论(thenQ部分中的行为所调用Q特别是当一个行为操作需要反复被调用Ӟ公用代码抽取出来成Z个函敎ͼ?
⑤rule 名称可以?#8220;”下取M名字?
属性列表:
属?cd 默认?功能描述
no-loop Boolean false 讄no-loop为true可以L该规则被再次ȀzR?
salience integer 0 优先U数字高的规则会比优先低的规则先执行?
agenda-group String MAIN 只有在具有焦点的agenda group中的规则才能够激发?
auto-focus Boolean false 如果该规则符合激zLӞ则该规则所在agenda-group自动获得焦点Q允许规则激发?
activation-group String N/A 在同名activation-group中的规则以互斥的方式激?
dialect String "java" or "mvel" 指定在LHS代码表达式或RHS代码块中使用的语a?
date-effective String, 包含日期/旉定义 N/A 规则只能在date-effective指定的日期和旉之后ȀzR?
date-exptires String, 包含日期/旉定义 N/A 如果当前旉在date-expires指定的时间之后,规则不能ȀzR?

duration long N/A 指出规则在指定的一D|间后Ȁ发,如果那个时候规则的ȀzL件还是处于true的情况下?
?nbsp; LHS (when) 条g元素
Z能够引用匚w的对象,使用一个模式绑定变量如‘$c’。变量的前缀使用?是可选的Q但是在复杂的规则中它会很方便用来区别变量与字段的不同?
$c : Cheese( type == "stilton", price < 10, age == "mature" )
&& 和|| U束q接W?
Cheese( type == "stilton" && price < 10, age == "mature" )
Cheese( type == "stilton" || price < 10, age == "mature" )
W一个有两个U束而第二个l有一个约束,可以通过圆括h改变求值的序?
单值约?
Matches 操作
Cheese( type matches "(Buffalo)?\S*Mozerella" )
Cheese( type not matches "(Buffulo)?\S*Mozerella" )
Contains 操作
CheeseCounter( cheeses contains "stilton" )
CheeseCounter( cheeses not contains "cheddar" )
memberof操作
CheeseCounter( cheese memberof $matureCheeses )
CheeseCounter( cheese not memberof $matureCheeses )
字符串约?
字符串约束是最单的U束格式Q将字段与指定的字符串求|数|日期Qstring或者boolean?
Cheese( quantity == 5 )
Cheese( bestBefore < "27-Oct-2007" )
Cheese( type == "stilton" )
Cheese( smelly == true )
l定变量U束
变量可以l定到Fact和它们的字段Q然后在后面的字D늺束中使用。绑定变量被UCؓ声明。有效的操作W由被约束的字段cd军_Q在那里会进行强制{换。绑定变量约束?=='操作W,因ؓ能够使用hash索引Q因此提供非常快的执行速度?
Person( likes : favouriteCheese )
Cheese( type == likes )
q回值约?
q回值约束可以用Q何有效的Java元数据类型或对象。要避免使用MDrools关键字作为声明标识。在q回值约束中使用的函数必返回静态常量(time constantQ结果。之前声明的l定可以用在表达式中?
Person( girlAge : age, sex == "F" )
Person( age == ( girlAge + 2) ), sex == 'M' )
复合值约?
复合值约束用在可能有多个允许值的时候,当前只支?in' ?not in'两个操作。这些操作用圆括号包含用逗号分开的值的列表Q它可以是变量,字符Ԍq回值或限定标识W?in' ?not in'q算式实际上被语法分析器重写成多?= and ==l成的多重约束?
Person( $cheese : favouriteCheese )
Cheese( type in ( "stilton", "cheddar", $cheese )
多重U束
多重U束允许你对一个字D通过使用'&&' 或?||'U束q接W进行多个约束条件的判断。允怋用圆括号分组Q它会让q种U束看v来更自然?
Person( age ( (> 30 && < 40) || (> 20 && < 25) ) )
Person( age > 30 && < 40 || location == "london" )
内联的EvalU束
evalU束可以使用M有效的语a表达式,只要它最l能被求gؓboolean元数据类型。表辑ּ必须是静态常量(time constantQ。Q何在当前模式之前定义的变量都可以使用Q自动代入(autovivificationQ机制用来自动徏立字D늻定变量。当构徏器发现标识不是当前定义的变量名是Q它?yu)尝试将它作为对象的字段来访问,q种情况下,构徏器自动在inline-eval中徏立该字段的同名变量?
Person( girlAge : age, sex = "F" )
Person( eval( girlAge == boyAge + 2 ), sex = 'M' )

⑦RHS (then) 执行操作
q部分应当包含一pd需要执行的操作。规则的RHS部分应该保持短的Q这保持它是声明性和可读性的。如果你发现你需要在RHS中用命令式或and/or条g代码Q那你可能需要将规则拆分为多个规则。RHS的主要目的是插入Q删除修改working memory数据?
"update(object, handle);" 告诉引擎对象已l改变(已经被绑定到LHS中的那一个)Qƈ且规则需要重新检查?
"insert(new Something());" 在working memory中放|一个你新徏的对象?
"insertLogical(new Something());" 与insertcMQ但是当没有更多的fact支持当前Ȁ发规则的真值状态时Q对象自动删除?
"retract(handle);" removes an object from working memory.
?Query
查询中仅仅包含规则LHS部分的结构(不用指定when或thenQ。它提供了查询working memory 中符合约束条件的对象的一个简单办法?
query "people over the age of 30"
    person : Person( age > 30 )
end
通过在返回的查询l果(QueryResults)上进行标准的for循环遍历Q每一行将q回一个QueryResultQ该对象可以用来存取l元中的每一个Column。这些Column可以通过声明的名U或索引位置存取?
QueryResults results = workingMemory.getQueryResults( "people over the age of 30" );
for ( Iterator it = results.iterator; it.hasNext(); ) {
    QueryResult result = ( QueryResult ) it.next();
    Person person = ( Person ) result.get( "person" );
    }

 



apple0668 2010-01-17 21:11 发表评论
]]>
eclipse3.4安装drools插g手记http://www.aygfsteel.com/apple0668/archive/2010/01/17/309883.htmlapple0668apple0668Sun, 17 Jan 2010 13:08:00 GMThttp://www.aygfsteel.com/apple0668/archive/2010/01/17/309883.htmlhttp://www.aygfsteel.com/apple0668/comments/309883.htmlhttp://www.aygfsteel.com/apple0668/archive/2010/01/17/309883.html#Feedback0http://www.aygfsteel.com/apple0668/comments/commentRss/309883.htmlhttp://www.aygfsteel.com/apple0668/services/trackbacks/309883.html 下蝲drools eclipse插gQ地址为:http://www.jboss.org/drools/downloads.html
解压用links方式安装插gQ如?font style="background-color: #cce8cf">features目录?font style="background-color: #cce8cf">plugins目录上层没有eclipse文g夹,pZ个?br />
在Eclipse目录下面新徏一个links文g夹,里面Z个XXX.linkQ内容ؓQpath=F://plugins/drools

启动EclipseQ在window----prefernces那里如果看不到又droolsQ就说明插g安装不成功?br />
Eclipse3.4安装drools插g遇到识别不了插gQ解x案如下:

F:\eclipse\configuration\org.eclipse.equinox.simpleconfigurator下面bundles.info最后加上以下几句:

org.guvnor.tools,5.0.1,file:plugins\org.guvnor.tools_5.0.1.jar,4,false
org.eclipse.webdav,3.0.101,file:plugins\org.eclipse.webdav_3.0.101.jar,4,false
org.drools.eclipse,5.0.1,file:plugins\org.drools.eclipse_5.0.1.jar,4,false
org.drools.eclipse.task,5.0.1,file:plugins\org.drools.eclipse.task_5.0.1.jar,4,false

保存卛_?br />
再次启动Eclipse可以成功安装插Ӟwindow----prefernces---drools插gQ配|drools的依赖包环境Q这些很单,省略?br />
新徏一个drools工程Q就会看C个附带的helloworld的例子,执行java文g卛_执行试?br />
Sample.drl

package com.sample
 
import com.sample.DroolsTest.Message;
 
rule "Hello World"
    when
        m : Message( status == Message.HELLO, myMessage : message )
    then
        System.out.println( myMessage ); 
        m.setMessage( "Goodbye cruel world" );
        m.setStatus( Message.GOODBYE );
        update( m );
end

rule "GoodBye"
    when
        Message( status == Message.GOODBYE, myMessage : message )
    then
        System.out.println( myMessage );
end


DroolsTest.java

 1package com.sample;
 2
 3import org.drools.KnowledgeBase;
 4import org.drools.KnowledgeBaseFactory;
 5import org.drools.builder.KnowledgeBuilder;
 6import org.drools.builder.KnowledgeBuilderError;
 7import org.drools.builder.KnowledgeBuilderErrors;
 8import org.drools.builder.KnowledgeBuilderFactory;
 9import org.drools.builder.ResourceType;
10import org.drools.io.ResourceFactory;
11import org.drools.logger.KnowledgeRuntimeLogger;
12import org.drools.logger.KnowledgeRuntimeLoggerFactory;
13import org.drools.runtime.StatefulKnowledgeSession;
14
15/**
16 * This is a sample class to launch a rule.
17 */

18public class DroolsTest {
19
20    public static final void main(String[] args) {
21        try {
22            // load up the knowledge base
23            KnowledgeBase kbase = readKnowledgeBase();
24            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
25            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
26            // go !
27            Message message = new Message();
28            message.setMessage("Hello World");
29            message.setStatus(Message.HELLO);
30            ksession.insert(message);
31            ksession.fireAllRules();
32            logger.close();
33        }
 catch (Throwable t) {
34            t.printStackTrace();
35        }

36    }

37
38    private static KnowledgeBase readKnowledgeBase() throws Exception {
39        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
40        kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);
41        KnowledgeBuilderErrors errors = kbuilder.getErrors();
42        if (errors.size() > 0{
43            for (KnowledgeBuilderError error: errors) {
44                System.err.println(error);
45            }

46            throw new IllegalArgumentException("Could not parse knowledge.");
47        }

48        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
49        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
50        return kbase;
51    }

52
53    public static class Message {
54        
55        public static final int HELLO = 0;
56        public static final int GOODBYE = 1;
57
58        private String message;
59
60        private int status;
61
62        public String getMessage() {
63            return this.message;
64        }

65
66        public void setMessage(String message) {
67            this.message = message;
68        }

69
70        public int getStatus() {
71            return this.status;
72        }

73
74        public void setStatus(int status) {
75            this.status = status;
76        }

77        
78    }

79
80}

输出Q?br />
Hello World
Goodbye cruel world



apple0668 2010-01-17 21:08 发表评论
]]>
վ֩ģ壺 | | ˮ| | | | | Ľ| | ɳ| Դ| | | | ξ| ¤| | | | | | ̫| ľ| | | ʲ| | | ʤ| Т| ½| Ͻ| | | ӯ| | ƺ| ȳ| ½| | |