drools 규칙 파일-문법

10179 단어 drools
원문:
http://liureying.blog.163.com/blog/static/615135201111394058945/
더 자세히 보기:drools 규칙 문법(1)
http://kingsun1980.iteye.com/blog/459272
Drools 와 JPA 를 사용 하여 지속 적 인 실시 간 데이터 분석 을 실현 합 니 다.
http://www.ibm.com/developerworks/cn/java/j-drools5/
Drools 에서 규칙 의 컴 파일 과 운행 은 Drools 가 제공 하 는 각종 API 를 통 해 이 루어 져 야 한다.이런 API 는 전체적으로 세 가지 로 나 눌 수 있다.규칙 컴 파일,규칙 수집 과 규칙 의 집행 이다.이 작업 을 완료 하 는 API 는 주로
KnowledgeBuilder,KnowledgeBase,Stateful KnowledgeSession,Stateless KnowledgeSession,등 은 규칙 파일 을 수집,컴 파일,오류 검사,fact 삽입,global 설정,실행 규칙 또는 규칙 흐름 등 역할 을 하 며 다양한 유형의 규칙 파일 작성 방식 과 문법 설명 을 본 격 적 으로 접 하기 전에우 리 는 먼저 이 API 들 의 기본 적 인 의미 와 사용 방법 을 익 힐 필요 가 있다.
KnowledgeBuilder 의 역할 은 업무 코드 에서 이미 작 성 된 규칙 을 수집 한 다음 에 이 규칙 파일 을 컴 파일 하 는 것 입 니 다.마지막 으로 컴 파일 된 규칙 패키지(KnowledgePackage)를 만들어 다른 프로그램 에 사용 하 는 것 입 니 다.
KnowledgeBuilder 를 통 해 컴 파일 된 규칙 파일 의 형식 은 여러 가지 가 있 습 니 다.예 를 들 어.dll 파일,.dslr 파일 또는 xls 파일 등 입 니 다.생 성 된 규칙 패 키 지 는 구체 적 인 규칙 파일 로 이 루어 질 수도 있 고 규칙 흐름(rule flow)파일 로 이 루어 질 수도 있 습 니 다.규칙 파일 을 추가 할 때 리 소스 Type 의 매 거 진 값 을 사용 하여 규칙 파일 의 형식 을 지정 해 야 합 니 다.또한 규칙 파일 을 지정 할 때 drools 는 ResourceFactory 라 는 대상 을 제공 합 니 다.이 대상 을 통 해 Classpath,URL,File,ByteArray,Reader 또는 XLS 와 같은 바 이 너 리 파일 에서 로드 규칙 을 추가 할 수 있 습 니 다.
KnowledgeBase 는 Drools 가 제공 하 는 응용 프로그램 에서 지식(knowledge)이 정의 하 는 지식 라 이브 러 리 대상 으로 KnowledgeBase 에 일반적인 규칙(rule),규칙 흐름(rule flow),함수 정의(function),사용자 정의 대상(type model)등 을 포함 할 수 있다.KnowledgeBase 자 체 는 그 어떠한 업무 데이터 대상(fact 대상,그 다음 에 해당 하 는 장 에서 fact 대상 을 중심 으로 소개)을 포함 하지 않 습 니 다.업무 대상 은 KnowledgeBase 에서 발생 하 는 두 가지 유형의 session 대상 에 삽입 되 어 있 습 니 다(Stateful KnowledgeSession 과 Stateless KnowledgeSession,그 다음 에 해당 하 는 장 에서 이 두 가지 유형의 대상 을 소개 합 니 다).session 대상 을 통 해 규칙 을 실행 하거나 규칙 흐름 을 시작 할 수 있 습 니 다.
Stateful KnowledgeSession 대상 은 규칙 엔진 과 가장 자주 사용 하 는 상호작용 방식 으로 규칙 엔진 과 지속 적 인 상호작용 통 로 를 구축 할 수 있 으 며 추리 계산 과정 에서 같은 데이터 세트 를 여러 번 촉발 할 수 있다.유용 하 다
사용자 의 코드 에서 마지막 으로 Stateful KnowledgeSession 대상 을 사용 한 후에 dispose()방법 을 사용 하여 관련 메모리 자원 을 방출 해 야 합 니 다.Stateful KnowledgeSession 은 외부 삽입(insert)의 업무 데 이 터 를 받 아들 일 수 있 습 니 다.fact 라 고도 합 니 다.
Stateless KnowledgeSession 의 역할 은 Stateful KnowledgeSession 과 비슷 하 며 모두 업무 데 이 터 를 수신 하고 규칙 을 집행 하 는 데 사용 된다.사실 Stateless KnowledgeSession 은 Stateful KnowledgeSession 을 포장 하여 Stateless KnowledgeSession 대상 을 사용 할 때 dispose()방법 으로 메모리 자원 을 방출 할 필요 가 없습니다.
Stateless KnowledgeSession 자체 가 가지 고 있 는 특성 때문에 사용 에 한계 가 있 습 니 다.Stateless KnowledgeSession 을 사용 할 때 fact 를 중복 삽입 하 는 작업 을 할 수 없고,fireAllRules()방법 을 중복 호출 하여 모든 규칙 을 실행 할 수 없습니다.이 작업 에 대응 하 는 작업 은 Stateless KnowledgeSession 에서 execute(..)방법 만 있 습 니 다.이 방법 을 통 해 모든 fact 를 삽입 하고 모든 규칙 이나 규칙 흐름 을 동시에 실행 할 수 있 습 니 다.사실상 execute(...)방법 을 실행 할 때 Stateless KnowledgeSession 내부 에서 insert()방법,fireAllRules()방법 과 dispose()방법 을 실행 한 것 이다.
fact 대상 은 보통 자바 의 POJO 입 니 다.보통 몇 개의 속성 이 있 습 니 다.모든 속성 은 getter 와 setter 방법 에 대응 하여 대외 적 으로 데 이 터 를 제공 하 는 설정 과 방문 을 합 니 다.일반적으로 Drools 규칙 엔진 에서 fact 가 담당 하 는 역할 은 규칙 에 사용 할 업무 데 이 터 를 응용 에서 전달 하 는 것 이 고 규칙 에 발생 하 는 데이터 와 상태의 변 화 는 fact 로 전달 하지 않 는 다.규칙 에 데이터 가 필요 하 다 면 Stateful KnowledgeSession 에 global 대상 을 설정 하여 실현 할 수 있 습 니 다.global 대상 도 일반적인 자바 대상 입 니 다.Stateful KnowledgeSession 에 global 대상 을 설정 할 때 insert 방법 을 사용 하지 않 고 setGlobal 방법 으로 이 루어 집 니 다.
    public static void main(String[] args) {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("test.drl",Test.class), ResourceType.DRL);
        Collection<KnowledgePackage> kpackage =kbuilder.getKnowledgePackages();
        KnowledgeBaseConfiguration kbConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
        kbConf.setProperty("org.drools.sequential", "true");
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbConf);
        kbase.addKnowledgePackages(kpackage);// KnowledgePackage     KnowledgeBase  
        StatefulKnowledgeSession statefulKSession = kbase.newStatefulKnowledgeSession();
        statefulKSession.setGlobal("globalTest", new Object());//    global  
        statefulKSession.insert(new Object());//    fact  
        statefulKSession.fireAllRules();
        statefulKSession.dispose();
    }

Drools 는 구축(Authoring)과 실행 시(Runtime)두 가지 주요 부분 으로 나 뉜 다.이 글 은 빌 드 시.dll 또는.xml 규칙 파일 작성 을 소개 합 니 다.
1.규칙 파일 문법 과 지원 하 는 언어
규칙 파일 은 자신의 문법 이 바 인 딩 매개 변수,조건 판단 과 function,query 등 규칙 파일 부분 을 구성 하 는 데 사 용 됩 니 다.
다른 부분 에 서 는 규칙 텍스트 로 언어 를 지원 할 수 있 습 니 다.현재 지원:mvel 과 자바.기본적으로 자바 를 사용 합 니 다.
그런 언어 를 쓰 더 라 도 그런 언어의 문법 을 지 켜 야 한다.
예시:
package com.demo
rule "It of valid age"
when
 
$a : Applicant( age < 18 )
then
 
$a.setValid(false);
end
note:
흑체 자 는 규칙 파일 키워드 입 니 다.
이 색상 글꼴 은 규칙 파일 문법 입 니 다.
이 색상 글꼴 은 자바 문법 입 니 다.
$a 는 규칙 내 변수 입 니 다.규칙 내 에서 이 규칙 변 수 를 조작 합 니 다.
2.규칙 파일 구성
package(규칙 파일 이 있 는 패키지*)import(자바 패키지 가 져 오기)globals function(함수)query(찾기)rules(규칙*)
3.규칙 엔진 처리 규칙 파일 프로 세 스
입력 매개 변수--->엔진 이 규칙 파일 을 읽 고 입력 매개 변 수 를 바 인 딩 합 니 다--->처리 규칙 만족 조건 은 결과 부분 논리 에 따라 처리 합 니 다.
4.규칙 파일 을 작성 하 는 방법
import 에 필요 한 가방 과 클래스,그리고 자바 정적 방법,문 구 는;끝나다
자바 속성 처리 문 구 는 rule 의 결과 부분 만 나타 나 고 조건 부분 에 서 는 문 구 를 만 들 수 있 습 니 다.
조건 부 에서 규칙 엔진 의 문법 을 사용 해 야 합 니 다.
5.문법 소개
바 인 딩 매개 변수 문법:
  $[바 인 딩 변수 이름]:Object([field 제약 조건])
예시:
$add:address()add 외부 에서 들 어 오 는 address 대상 을 연결 합 니 다.
$add:new Address()add 새 address 대상 연결
$name:String(); 문자열 과 name 바 인 딩 을 입력 합 니 다.
조건 부 판단
$바 인 딩 변수 이름:바 인 딩 유형(속성 1 비교 값 에 부합)
note:
괄호 안에 여러 개의 속성 을 포함 할 수 있 습 니 다."&","|","," 
"&&"표시 및,"||"표시 or,"연결 표시
예시:
$app:Applicant(name=="이 른 아침",age<30)  
\#만족 name=새벽,age<30 의 Applicant
   결과 부분 처리
      1.insert,update,retract 를 통 해 현재 Working Memory 의 Fact 대상 을 추가,삭제 또는 수정 합 니 다.
note:
insert,update,retract 매크로 함 수 를 호출 하면 Drools 는 모든 규칙 과 다시 일치 합 니 다.no-loop 속성 을 true 로 설정 하지 않 은 규칙 에 대해 서 는 조건 이 만족 하면 이전에 실 행 했 든 안 했 든 다시 실 행 됩 니 다.
insert
역할:
자바 클래스 에서 Stateful KnowledgeSession 대상 을 호출 하 는 insert 방법 은 같은 역할 을 합 니 다.
문법:
insert(new Object());
예시:
rule "rule1" 
salience 1
when 
eval(true);
then  
System.out.println("rule1");
Applicant app = new Applicant("kaka",24);
#insert(app);
drools.insert(app); 
end

update
역할:
update 함수 의 의 미 는 이름 과 마찬가지 로 현재 Working Memory 의 Fact 를 실현 하 는 데 사 용 됩 니 다.
문법:
update(new Object());
예시:
rule "rule2"
    salience 1
    #no-loop true     
 when
       $app:Applicant(name == "  ",age<30)
 then
       #update  2
       Applicant app = new Applicant("  ",$app.getAge() + 1); 
       update(drools.getWorkingMemory().getFactHandleByIdentity($app),app); 
    
       #update  1 
       #$app.setAge($app.getAge() + 1);
       #update($app);
       System.out.println("------" + $app.getName()+"("+ $app.getAge() + ")");
end

retract
역할:
StatefulSession 의 retract 방법 과 마찬가지 로 매크로 함수 retract 도 Working Memory 에 사용 합 니 다.
어떤 Fact 대상 이 Working Memory 에서 삭 제 됩 니 다.
문법:
update(new Object());
예시:
rule "rule2"
salience 1 
when 
$app:Applicant(name == "  "); 
then   
#retract($app); 
drools.retract($app);  
end

note:
insert,update,retract 함수 외 에 drools 매크로 대상 이 규칙 을 처리 합 니 다.
$로 변 수 를 바 인 딩 할 수 있 습 니 다.자바 대상 을 바 인 딩 하 는 방법
$app.setAge($app.getAge() + 1);

예:
1.리스트 옮 겨 다 니 기:
정의:
package com.pandy.rulemodel;

import com.pandy.model.RhSysGrid;
import com.pandy.model.RhSysGridColumn;
import com.pandy.model.RhSysUser;

import java.util.List;
public class TestProcessModel {
    List<RhSysGrid> gridList;
    List<RhSysGridColumn> columnList;
    List<RhSysUser> userList;
    //......
}

시작 하기 전에 데이터 초기 화:
        Map<String, Object> params = new HashMap<String, Object>();
        List<RhSysGrid> gridList = rhService.getAllGrid();
        List<RhSysGridColumn> columnList = rhService.getAllGridColumn();
        List<RhSysUser> userList = rhService.getAllUser();

        TestProcessModel testProcessModel = new TestProcessModel();
        testProcessModel.setGridList(gridList);
        testProcessModel.setColumnList(columnList);
        testProcessModel.setUserList(userList);
        params.put("testProcessModel", testProcessModel);
        ksession1.startProcess(proId, params);
        ksession1.fireAllRules();

작업 흐름 RuleTask 앞의 ScriptTask 엔진 에 정보 추가:변수 설정 생략 등
kcontext.getKnowledgeRuntime().insert(testProcessModel);

규칙 파일:
package com.pandy.jbpm;


import java.util.List;
import com.pandy.model.RhSysGrid;
import com.pandy.rulemodel.TestProcessModel;

rule "Hello World Rule" ruleflow-group "Print"
when
	$testModel : TestProcessModel()
	$gridList : List() from collect ( RhSysGrid(gridId<=100) from $testModel.gridList )
then
	System.out.println("  Drools    : Hello World Rule="+ $gridList.size());
end

좋은 웹페이지 즐겨찾기