第 4 章 BRMS 概​念​


4.1. 规​则​是​资​产​

资​产​(Asset)是​可​以​以​某​个​版​本​存​储​在​库​里​的​任​何​东​西​。​它​包​括​规​则​、​决​策​表​、​模​型​、​测​试​和​ DSL。​

注意

术​语​“​规​则​(rule)”​用​得​很​广​泛​。​它​有​时​候​指​的​是​实​际​上​并​非​资​产​的​规​则​。​

4.2. 分​类​

图 4.1. 类​别​

类​别​允​许​规​则​(资​产​)用​你​定​义​的​任​何​数​量​的​组​别​进​行​标​记​。​这​意​味​着​你​可​以​查​看​匹​配​某​个​类​别​的​一​个​规​则​列​表​。​规​则​可​以​属​于​任​何​数​目​的​类​别​。​在​上​面​的​图​表​里​,你​可​以​看​到​的​是​类​似​于​文​件​夹​/浏​览​器​的​资​产​视​图​。​其​名​字​是​由​ BRMS 管​理​员​定​义​的​(你​也​可​以​删​除​/添​加​新​类​别​;但​你​只​能​在​它​们​没​有​在​使​用​时​删​除​它​们​),可​以​是​你​希​望​的​任​意​名​称​。​
通​常​,类​别​是​用​匹​配​规​则​应​用​的​商​业​领​域​的​有​意​义​的​名​称​来​创​建​的​。​(因​此​,如​果​规​则​应​用​在​多​个​领​域​,你​可​以​附​加​多​个​类​别​。​)类​别​也​可​以​用​来​标​记​规​则​为​生​命​周​期​的​某​个​阶​段​,例​如​标​记​为​ "Draft“​ 或​ "For Review“​。​

图 4.2. 可​以​有​多​个​类​别​的​资​产​

上​面​的​视​图​显​示​了​你​打​开​资​产​时​看​到​的​ Category Editor/Viewer。​在​这​个​例​子​里​,你​可​以​看​到​资​产​属​于​两​个​类​别​。​这​意​味​着​当​其​中​任​何​一​个​类​别​用​于​显​示​资​产​列​表​时​,你​都​将​看​到​该​资​产​。​(“​+”​ 按​钮​和​ Garbage Can 图​标​可​分​别​用​来​添​加​和​删​除​其​他​项​目​。​)
在​上​面​的​例​子​里​,第​一​个​类​别​('Home")位​于​ "top level"。​而​第​二​个​类​别​ “​Mortage/Eligibility" 仍​是​一​个​单​一​的​类​别​,但​它​是​嵌​套​的​,这​是​因​为​类​别​是​具​有​层​次​结​构​的​。​要​以​另​外​一​种​方​式​表​述​它​,就​是​名​为​ “​Mortage" 的​类​别​包​含​一​个​类​别​ “​Eligibility“​。​屏​幕​将​它​显​示​为​ ”​Mortage/Eligibility”​。​如​你​所​看​到​的​,
当​你​打​开​一​个​资​产​以​进​行​查​看​或​编​辑​时​,你​会​看​到​它​所​属​的​类​别​列​表​。​如​果​你​进​行​了​修​改​(删​除​或​添​加​类​别​),你​将​需​要​保​存​资​产​,且​这​个​行​为​将​在​版​本​历​史​里​创​建​一​个​新​的​条​目​。​修​改​规​则​的​类​别​不​会​影​响​其​执​行​。​

图 4.3. 创​建​类​别​

上​面​的​视​图​显​示​了​设​立​类​别​的​管​理​屏​幕​。​系​统​里​缺​省​是​没​有​类​别​的​。​因​为​类​别​是​具​有​层​次​结​构​的​,创​建​子​类​别​时​你​必​须​选​择​“​父​”​类​别​。​在​这​里​,你​也​可​以​删​除​类​别​(但​只​能​在​它​们​没​有​被​任​何​资​产​使​用​的​情​况​下​)。​

注意

作​为​一​个​普​通​的​规​则​,资​产​应​该​属​于​一​个​或​两​个​类​别​。​当​你​有​大​量​的​规​则​时​,类​别​是​很​重​要​的​。​其​层​次​结​构​不​需​要​太​深​。​红​帽​设​计​它​们​是​为​了​帮​助​你​将​规​则​/资​产​分​解​为​可​管​理​的​小​片​内​容​。​

4.3. 规​则​授​权​

BRMS 平​台​支​持​几​个​资​产​(规​则​)格​式​。​我​们​描​述​的​是​关​键​的​格​式​。​本​手​册​里​的​其​他​部​分​将​涵​盖​另​外​一​些​格​式​,其​细​节​则​不​会​在​此​重​复​。​

4.3.1. 资​产​编​辑​器​(Asset Editor)

资​产​编​辑​器​里​的​可​用​选​项​取​决​于​编​辑​的​资​产​类​型​。​资​产​编​辑​器​用​于​编​辑​规​则​,它​也​可​以​用​于​添​加​、​删​除​、​出​席​排​序​条​件​、​约​束​、​行​为​、​字​段​和​选​项​。​资​产​编​辑​器​也​允​许​用​户​使​用​工​作​集​、​检​验​和​验​证​规​则​以​及​查​看​规​则​源​。​
相​关​的​细​节​请​查​看​资​产​编​辑​器​里​的​工​具​提​示​。​

图 4.4. 资​产​编​辑​器​视​图​

当​编​辑​规​则​时​,资​产​编​辑​器​也​称​为​ ”​Guided Editor“​。​Guided Editor 用​于​编​辑​商​业​规​则​语​言​(BRL)格​式​的​规​则​。​Guided Editor 提​示​用​户​根​据​正​在​编​辑​的​规​则​的​对​象​模​型​进​行​输​入​。​
在​你​可​以​使​用​ BRL Guided Editor 之​前​,你​必​须​先​配​置​软​件​包​访​问​。​

注意

Eclipse 插​件​里​也​包​含​一​个​ Guided Editor。​本​节​里​大​部​分​细​节​也​适​用​于​它​。​

例 4.1. Guided Editor

4.3.3. 规​则​的​分​解​

规​则​由​多​个​部​分​组​成​:
  • When
    规​则​的​ When 部​分​是​一​个​必​须​满​足​的​条​件​。​例​如​,在​ 例 4.1 “Guided Editor” 里​,when 部​分​是​:当​申​请​者​低​于​ 21 岁​。​
  • Then
    规​则​的​ Then 部​分​是​规​则​的​条​件​部​分​已​经​满​足​后​必​须​执​行​的​行​为​。​例​如​,在​ 例 4.1 “Guided Editor” 里​,when 部​分​是​:当​申​请​者​低​于​ 21 岁​。​
使​用​ Guided Editor 也​可​以​在​ When(或​条​件​)部​分​添​加​更​多​的​条​件​并​在​ Then(或​行​为​)部​分​添​加​更​多​的​行​为​。​例​如​,如​果​一​个​ 21 岁​以​下​的​申​请​者​有​贷​款​申​请​的​担​保​人​,银​行​可​能​决​定​批​准​它​的​贷​款​申​请​。​为​了​将​这​种​情​形​在​ 例 4.1 “Guided Editor” 里​模​型​化​,修​改​何​时​包​括​担​保​人​条​件​是​有​必​要​的​。​

例 4.2. 修​改​规​则​

要​在​条​件​里​添​加​担​保​人​,你​首​先​需​要​在​ Mortgage 模​型​的​ Fact Type 里​添​加​ guarantor 字​段​。​

过程 4.1. 在​ Fact Type 里​添​加​字​段​

  1. 选​择​模​型​

    从​屏​幕​的​左​侧​导​航​面​板​里​选​择​ Knowledge Bases。​扩​展​包​含​模​型​的​软​件​包​并​选​择​ model。​
    点​击​ open 从​列​表​里​打​开​模​型​。​
  2. 添​加​字​段​

    点​击​后​面​的​加​号​以​扩​展​ Fact Type,然​后​选​择​添​加​字​段​(Add Field)。​
  3. 输​入​字​段​细​节​

    添​加​细​节​到​弹​出​对​话​框​里​。​在​ Field name 字​段​里​输​入​名​称​ guarantor,然​后​从​ Type 下​拉​菜​单​里​选​择​ True or False。​
    选​择​ File 和​ Save changes 将​修​改​保​存​到​模​型​里​。​
因​为​在​ applicant fact 类​型​里​添​加​了​ guarantor 字​段​,我​们​有​可​能​修​改​规​则​以​包​括​一​个​ guarantor。​

过程 4.2. 在​规​则​里​添​加​限​制​

  1. 删​除​当​前​的​限​制​

    当​编​辑​现​有​的​规​则​时​,你​有​必​要​删​除​当​前​的​限​制​。​这​可​以​确​保​处​理​多​个​限​制​时​选​择​正​确​的​逻​辑​操​作​符​(And 或​ Or)。​
    在​这​个​例​子​里​,点​击​ Age 条​件​后​面​的​减​号​。​
  2. 修​改​约​束​

    点​击​文​本​ There is an Applicant 打​开​ Modify Constraints Dialogue。​
    从​ Add a restriction on a field 下​列​菜​单​里​选​择​限​制​。​在​这​个​例​子​是​选​择​ Age。​
    从​ Multiple field constraints 下​列​菜​单​里​选​择​ All of (and)。​
  3. 指​定​第​一​个​约​束​

    点​击​文​本​ all of the following 以​打​开​ Add fields to this constraint 对​话​框​并​添​加​限​制​。​在​这​个​例​子​里​是​选​择​ Age。​
    从​新​的​下​拉​菜​单​里​选​择​ less than,然​后​点​击​铅​笔​图​标​以​编​辑​它​的​值​,选​择​ literal,然​后​点​击​ Value 输​入​合​适​的​值​,这​个​例​子​里​是​输​入​ 21。​
  4. 指​定​第​二​个​约​束​

    点​击​文​本​ all of the following 以​打​开​ Add fields to this constraint 对​话​框​并​添​加​限​制​。​在​这​个​例​子​里​是​选​择​ Guarantor。​
    从​新​的​下​拉​菜​单​里​选​择​ equal to,然​后​点​击​铅​笔​图​标​以​编​辑​它​的​值​,选​择​ literal,然​后​点​击​ true 输​入​合​适​的​值​,并​选​择​ False。​

4.3.4. Saliance

你​可​以​通​过​ Guided Editor 里​的​ Options 中​编​辑​ Saliance。​Salience 是​一​个​代​表​优​先​级​的​数​值​。​
请​注​意​,你​可​以​将​字​段​值​限​制​为​预​先​配​置​的​列​表​条​目​。​这​个​列​表​配​置​为​软​件​包​(用​于​填​充​值​的​数​据​枚​举​)的​一​部​分​。​这​些​值​可​以​是​固​定​列​表​,如​从​数​据​库​里​加​载​的​值​。​对​于​具​有​给​定​值​的​代​码​和​其​他​字​段​,这​尤​其​有​用​。​它​也​可​以​以​下​拉​列​表​的​方​式​显​示​在​屏​幕​上​,和​规​则​里​使​用​的​值​(或​代​码​)不​一​样​。​关​于​如​何​进​行​配​置​,请​参​考​ "Data Enumerations" 章​节​里​的​内​容​。​

4.3.6. 增​加​ DSL 语​句​

如​果​规​则​所​属​的​软​件​包​具​有​ DSL 配​置​,在​你​添​加​条​件​或​行​为​时​,它​将​提​供​一​个​ “​DSL 语​句​”​ 列​表​,你​可​以​从​中​选​择​(选​择​一​个​条​目​会​添​加​一​行​规​则​),凭​借​来​自​用​户​的​ DSL 指​定​值​,编​辑​框​(文​本​)将​会​显​示​(它​组​成​一​个​表​单​)。​请​注​意​这​是​可​选​的​,你​可​以​选​择​其​他​ DSL 编​辑​器​。​

重要

Guided Editor 目​前​不​支​持​完​整​的​ DSL 功​能​,它​只​支​持​ DSL 配​置​的​ [when] 和​ [then] 部​分​。​
下​面​的​图​表​显​示​了​ Guided Editor 里​的​ DSL 语​句​:

图 4.5. Guided Editor 里​的​ DSL

4.3.7. DSL 规​则​

DSL 规​则​是​文​本​值​,它​使​用​一​个​语​言​配​置​资​产​来​控​制​其​外​观​。​

图 4.6. DSL 规​则​

DSL 是​一​个​单​一​的​规​则​。​在​上​面​的​图​片​里​,你​可​以​看​到​文​本​编​辑​器​。​你​可​以​使​用​右​侧​的​图​表​来​提​供​条​件​和​行​为​列​表​以​供​选​择​(或​者​同​时​按​住​ Control 和​空​格​键​来​弹​出​列​表​)。​

4.3.8. 电​子​表​格​决​策​表​

多​个​规​则​可​以​存​储​在​ Microsoft Excel 的​电​子​表​格​里​(.xls 文​件​格​式​),每​一​行​都​代​表​一​个​规​则​。​本​章​不​会​涉​及​电​子​表​格​的​细​节​。​

图 4.7. 电​子​表​格​决​策​表​

要​使​用​电​子​表​格​,如​ 图 4.7 “电​子​表​格​决​策​表​” 所​展​示​的​,上​传​一​个​ .xls 文​件​。​你​也​可​以​下​载​从​相​同​的​对​话​框​下​载​当​前​版​本​的​电​子​表​格​。​为​了​创​建​一​个​新​的​决​策​表​,你​必​须​启​动​“​规​则​向​导​“​,它​包​含​一​个​这​个​过​程​的​选​项​,然​后​你​可​以​上​传​ .xls 文​件​。​

4.3.9.  Guided 决​策​表​(基​于​ Web)

Guided 决​策​表​功​能​允​许​决​策​表​在​ web 上​编​辑​。​它​通​过​内​省​哪​些​ fact 和​字​段​可​用​来​引​导​决​策​表​的​创​建​,这​和​ Guided Editor 类​似​。​规​则​属​性​、​元​数​据​、​条​件​和​行​为​都​可​以​以​治​表​格​式​定​义​,从​而​有​助​于​大​量​相​关​规​则​的​快​速​输​入​。​象​其​他​规​则​资​产​一​样​,基​于​ Web 的​决​策​表​会​被​编​译​成​ DRL。​
你​可​以​多​种​方​式​选​择​单​元​格​:
  • 你​可​以​双​击​单​个​的​单​元​格​以​弹​出​对​应​底​层​数​据​类​型​的​编​辑​器​。​相​同​列​的​单​元​格​组​可​以​通​过​点​击​第​一​个​单​元​格​并​拖​动​光​标​或​在​点​击​第​一​个​单​元​后​再​点​击​要​选​取​范​围​里​的​最​后​一​个​(同​时​按​住​ Shift 键​)来​进​行​选​择​。​
  • 或​者​,你​也​可​以​使​用​箭​头​键​在​表​格​里​移​动​。​按​住​ Enter 键​将​弹​出​对​应​的​编​辑​器​。​按​住​ Shift 同​时​用​箭​头​键​扩​展​选​择​范​围​可​以​选​择​一​个​区​域​。​
如​要​修​改​列​的​大​小​,用​鼠​标​在​表​头​的​分​界​处​悬​停​,然​后​拖​动​鼠​标​光​标​将​使​列​变​窄​或​变​宽​。​

图 4.8. 决​策​表​

4.3.9.1. 主​要​的​组​件​

Guided 决​策​表​分​成​两​个​主​要​的​部​分​:
  • 上​面​的​部​分​允​许​定​义​表​的​列​来​代​表​规​则​属​性​、​元​数​、​条​件​和​行​为​。​
  • 下​面​的​部​分​包​含​实​际​的​表​,而​每​一​行​都​定​义​单​独​的​规​则​。​

图 4.9. 主​要​的​组​件​

4.3.9.2. 列​配​置​

列​可​以​有​下​列​的​约​束​类​型​:
  • Literal
    单​元​格​里​的​值​将​用​操​作​符​和​字​段​进​行​比​较​。​
  • Formula
    单​元​格​里​的​表​达​式​将​被​评​估​,然​后​和​字​段​进​行​比​较​。​
  • Predicate
    不​需​要​字​段​,表​达​式​将​被​评​估​为​ true 或​ false。​
你​可​以​设​置​缺​省​值​,但​通​常​在​单​元​格​里​没​有​值​的​话​,约​束​不​会​被​应​用​。​

图 4.10. 列​配​置​

4.3.9.2.1. 工​具​列​
在​缺​省​情​况​下​,包​含​规​则​号​码​和​描​述​的​两​列​都​会​被​提​供​。​
4.3.9.2.2. 属​性​列​
你​可​以​添​加​代​表​任​何​ DRL 规​则​属​性​到​零​或​多​个​属​性​列​。​在​ Guided 决​策​表​编​辑​器​来​还​有​一​个​额​外​的​伪​属​性​来​ "否​定​(negate)" 规​则​。​使​用​这​个​属​性​可​以​否​定​整​个​规​则​。​例​如​,下​面​的​简​单​规​则​可​以​被​否​定​。​
when
  $c : Cheese( name == "Cheddar" )
then
  ...
end
Copy to Clipboard Toggle word wrap
when
  not Cheese( name == "Cheddar" )
then
  ...
end
Copy to Clipboard Toggle word wrap
4.3.9.2.3. 元​数​据​列​(Meta-data column)
你​可​以​定​义​零​个​或​多​个​元​数​据​,每​个​都​代​表​ DRL 规​则​上​正​常​的​元​数​据​注​解​。​
4.3.9.2.4. 条​件​列​(Condition Column)
条​件​代​表​右​手​边​定​义​的​事​实​模​式​(fact pattern)或​规​则​的​ "When" 部​分​。​要​定​义​一​个​条​件​列​,你​必​须​定​义​模​型​类​绑​定​或​者​选​择​一​个​已​经​定​义​的​绑​定​。​完​成​后​你​就​可​以​定​义​字​段​约​束​了​。​如​果​两​个​或​多​个​列​都​使​用​了​相​同​的​事​实​模​式​绑​定​,字​段​约​束​将​变​成​相​同​模​式​的​复​合​字​段​约​束​。​如​果​你​为​单​个​的​模​型​类​定​义​了​多​个​绑​定​,每​个​绑​定​都​会​变​成​规​则​右​手​边​的​单​独​的​模​型​类​。​
4.3.9.2.5. 行​为​列​(Action Column)
你​可​以​定​义​行​为​列​来​在​规​则​引​擎​的​工​作​内​存​里​执​行​绑​定​事​实​上​的​简​单​操​作​或​者​创​建​全​新​的​事​实​。​新​的​事​实​可​以​在​逻​辑​上​插​入​到​规​则​引​擎​的​工​作​内​存​,从​而​服​从​平​常​的​真​相​维​护​(truth maintenance )。​关​于​真​相​维​护​和​逻​辑​插​入​的​更​多​信​息​,请​参​考​《​JBoss Rules 参​考​指​南​》​。​

4.3.9.3. 规​则​定​义​

本​节​允​许​使​用​之​前​定​义​的​列​来​定​义​个​体​规​则​。​

图 4.11. 规​则​定​义​

4.3.9.4. 单​元​合​并​

决​策​表​左​上​角​的​图​标​切​换​单​元​格​合​并​的​开​与​关​。​当​进​行​单​元​格​合​并​时​,那​些​在​相​同​列​里​且​具​有​相​同​值​的​单​元​格​将​合​并​成​单​个​的​单​元​格​。​这​简​化​了​修​改​分​享​相​同​原​始​值​的​多​个​单​元​格​的​内​容​。​当​单​元​格​被​合​并​时​,它​们​也​在​单​元​格​的​左​上​角​显​示​一​个​图​标​以​允​许​对​跨​越​合​并​单​元​格​的​行​进​行​分​组​。​

图 4.12. 单​元​合​并​

4.3.9.5. 单​元​分​组​

已​经​被​合​并​的​单​元​格​可​以​进​一​步​收​缩​成​单​一​的​行​。​点​击​左​上​角​的​ [+\-] 图​标​将​收​缩​对​应​的​行​为​一​行​。​跨​越​收​缩​的​具​有​相​同​值​的​行​的​其​他​列​里​的​单​元​格​将​不​受​影​响​。​而​跨​越​收​缩​的​具​有​不​同​值​的​行​的​其​他​列​里​的​单​元​格​将​高​亮​显​示​且​显​示​第​一​个​值​。​

图 4.13. 单​元​分​组​

当​分​组​单​元​格​的​值​被​改​动​时​,已​经​收​缩​的​所​有​的​单​元​格​都​将​更​新​它​们​的​值​。​

4.3.9.6. Otherwise 操​作​

定​义​为​使​用​等​号​ == 或​不​等​号​ != 操​作​符​的​ literal 值​的​条​件​列​可​以​利​用​一​个​特​殊​决​策​表​的​单​元​格​值​ otherwise。​这​个​特​殊​的​值​允​许​定​义​规​则​来​匹​配​没​有​在​表​里​其​他​规​则​里​显​性​定​义​的​值​。​我​们​最​好​用​以​下​的​例​子​来​解​释​:
when
  Cheese( name not in ("Cheddar", "Edam", "Brie") )
  ...
then
  ...
end
Copy to Clipboard Toggle word wrap
when
  Cheese( name in ("Cheddar", "Edam", "Brie") )
  ...
then
  ...
end
Copy to Clipboard Toggle word wrap

4.3.10. 规​则​模​板​

规​则​模​板​允​许​用​户​定​义​一​个​带​有​占​位​符​(其​值​从​表​数​据​里​获​取​)的​规​则​结​构​。​也​你​也​可​以​继​续​使​用​ Literal 值​、​公​式​(Formula)和​表​达​式​(Expression)。​
规​则​模​板​经​常​可​用​来​替​换​决​策​表​。​

过程 4.3. 创​建​规​则​模​板​

  1. 创​建​规​则​模​板​资​产​

    从​ Knowledge Bases 菜​单​,选​择​ Create New,然​后​选​择​ New Rule Template。​
  2. 定​义​资​产​

    输​入​模​板​的​名​称​、​类​别​和​描​述​。​
  3. 定​义​模​板​

    使​用​ guided editor 来​构​造​规​则​。​模​板​关​键​字​(Template key) 是​字​段​约​束​和​行​为​部​分​里​的​占​位​符​。​你​也​可​以​在​标​准​ guided editor 继​续​使​用​ Literal 值​、​公​式​(Formula)和​表​达​式​(Expression)。​
例 4.3 “示​例​模​板​” 解​释​了​一​个​已​经​用​模​板​关​键​字​(Template Key)定​义​的​简​单​规​则​,它​用​于​申​请​者​的​最​大​年​龄​、​最​小​年​龄​和​信​用​级​别​。​模​板​关​键​字​已​经​分​别​定​义​为​ "$max_age"、​"$min_age" 和​ "$cr"。​

例 4.3. 示​例​模​板​

4.3.10.1. 定​义​模​板​数​据​

当​你​完​成​规​则​模​板​的​定​义​后​,你​需​要​输​入​用​于​插​入​“​模​板​关​键​字​”​占​位​符​的​数​据​。​BRMS 提​供​了​在​ Guided Editor 屏​幕​上​的​灵​活​的​网​格​里​输​入​数​据​的​机​制​。​在​ Guided Editor 屏​幕​上​按​ Load Template Data 按​钮​可​以​启​动​网​格​编​辑​器​。​
规​则​模​板​的​数​据​网​格​是​非​常​灵​活​的​,对​于​底​层​不​同​的​数​据​类​型​有​不​同​的​弹​出​编​辑​器​。​列​可​以​调​整​大​小​和​排​序​,而​单​元​格​可​以​合​并​和​分​组​以​助​于​快​速​的​数​据​录​入​。​
每​个​Template Key 占​位​符​可​插​入​一​行​数​据​,由​此​每​一​行​都​称​为​了​一​条​规​则​。​

注意

如​果​某​一​样​的​任​何​单​元​格​为​空​,那​么​该​行​规​则​就​不​会​生​成​。​

图 4.14. 模​板​数​据​网​格​

4.3.10.1.1. 单​元​合​并​
网​格​左​上​角​的​图​标​切​换​单​元​格​合​并​的​开​与​关​。​当​进​行​单​元​格​合​并​时​,那​些​在​相​同​列​里​且​具​有​相​同​值​的​单​元​格​将​合​并​成​单​个​的​单​元​格​。​这​简​化​了​修​改​分​享​相​同​原​始​值​的​多​个​单​元​格​的​内​容​。​当​单​元​格​被​合​并​时​,它​们​也​在​单​元​格​的​左​上​角​显​示​一​个​图​标​以​允​许​对​跨​越​合​并​单​元​格​的​行​进​行​分​组​。​

图 4.15. 单​元​合​并​

4.3.10.1.2. 单​元​分​组​
已​经​被​合​并​的​单​元​格​可​以​进​一​步​收​缩​成​单​一​的​行​。​点​击​左​上​角​的​ [+\-] 图​标​将​收​缩​对​应​的​行​为​一​行​。​跨​越​收​缩​的​具​有​相​同​值​的​行​的​其​他​列​里​的​单​元​格​将​不​受​影​响​。​而​跨​越​收​缩​的​具​有​不​同​值​的​行​的​其​他​列​里​的​单​元​格​将​高​亮​显​示​且​显​示​第​一​个​值​。​

图 4.16. 单​元​分​组​

当​分​组​单​元​格​的​值​被​改​动​时​,已​经​收​缩​的​所​有​的​单​元​格​都​将​更​新​它​们​的​值​。​

4.3.10.2. 生​成​的​ DRL

规​则​作​者​可​以​查​看​将​为​规​则​模​板​和​相​关​联​的​数​据​生​成​的​ DRL,虽​然​这​并​没​有​必​要​。​这​个​功​能​及​其​操​作​和​用​于​其​他​资​产​的​没​有​区​别​。​选​择​ Source,然​后​再​从​资​产​编​辑​器​屏​幕​选​择​ View Source 菜​单​。​这​将​显​示​所​有​规​则​的​ DRL。​

图 4.17. 生​成​的​ DRL

4.3.11. 规​则​流​

规​则​流​:规​则​流​允​许​你​用​可​视​方​式​描​述​进​行​的​步​骤​ - 所​以​不​是​所​有​的​规​则​都​会​立​即​进​行​评​估​,这​是​一​个​逻​辑​流​。​本​章​不​会​涵​盖​ BRMS 上​的​规​则​流​,但​你​可​以​使​用​ IDE 画​出​图​形​化​规​则​流​并​上​传​ .rfm 到​ BRMS。​
和​电​子​表​格​相​似​,你​可​以​上​传​/下​载​规​则​流​文​件​(Eclipse IDE 有​个​对​应​的​图​形​化​编​辑​器​)。​我​们​不​会​在​此​讨​论​规​则​流​的​细​节​。​

4.3.12. 技​术​性​规​则​(DRL)

技​术​性​规​则​(DRL)存​储​为​文​本​且​可​以​在​ BRMS 里​进​行​管​理​。​DRL 文​件​可​以​包​含​一​个​或​多​个​规​则​。​如​果​文​件​只​包​含​一​个​规​则​,那​么​软​件​包​、​导​入​和​规​则​语​句​都​是​不​必​要​的​。​你​可​以​只​使​用​ "When" 和​ "Then" 来​分​别​标​记​ "Condition“​ 和​ "Action" 部​分​。​
通​常​你​将​使​用​集​成​的​开​发​环​境​来​编​辑​ “​原​生​”​ DRL 文​件​,这​是​因​为​ IDE 拥​有​高​级​的​工​具​、​内​容​助​手​和​调​试​功​能​。​然​而​,有​时​候​规​则​得​处​理​ BRMS 里​的​软​件​包​里​的​非​常​技​术​性​的​东​西​。​在​任​何​典​型​的​规​则​软​件​包​里​,你​通​常​都​需​要​ “​技​术​性​规​则​”​。​当​然​你​也​可​以​将​所​有​的​规​则​类​型​混​合​并​进​行​匹​配​。​

图 4.18. DRL 技​术​性​规​则​

4.3.13. 功​能​

功​能​是​另​外​一​类​资​产​。​它​们​不​是​资​产​且​应​该​只​在​需​要​时​才​被​使​用​。​"Function Editor" 是​一​个​文​本​编​辑​器​。​

图 4.19. 功​能​

数​据​枚​举​(Data enumeration)是​资​产​的​一​个​可​选​类​型​,你​可​以​配​置​它​为​ Guided Editor 提​供​下​拉​列​表​。​它​们​和​其​他​资​产​一​样​可​以​存​储​和​编​辑​,且​只​应​用​于​它​们​所​属​的​软​件​包​。​
枚​举​配​置​的​内​容​是​ "Fact.field" 到​一​个​值​列​表​的​映​射​。​这​些​值​用​在​一​个​下​列​列​表​里​。​这​个​列​表​可​以​是​文​字​的​,或​者​使​用​工​具​类​(你​放​入​ classpath 里​的​)来​加​载​字​符​串​。​这​些​字​符​串​包​含​显​示​在​下​拉​列​表​里​的​值​,或​者​代​码​值​(规​则​里​使​用​的​结​尾​)的​映​射​和​显​示​值​(请​看​下​面​的​例​子​,它​使​用​ '=')。​
'Board.type' : [ 'Short', 'Long', 'M=Mini', 'Boogie']
'Person.age' : [ '20', '25', '30', '35' ]
Copy to Clipboard Toggle word wrap
在​上​面​的​枚​举​配​置​里​,"M" 表​示​用​在​规​则​里​的​值​,而​ "Mini" 则​是​显​示​在​图​形​界​面​里​的​值​。​
从​外​部​源​获​取​数​据​列​表​
BRMS 也​可​以​调​用​加​载​字​符​串​列​表​的​代​码​。​为​此​,你​需​要​一​段​返​回​ java.util.List 到​ BRMS 的​ classpath 的​代​码​。​不​是​指​定​ BRMS 的​值​列​表​,代​码​是​返​回​字​符​串​列​表​。​(通​常​,如​果​你​想​为​规​则​使​用​不​同​的​显​示​值​,你​可​以​在​字​符​串​里​使​用​ "=" 符​号​。​)例​如​,你​可​以​修​改​上​面​的​ Person.age 行​为​:
'Person.age' : (new com.yourco.DataHelper()).getListOfAges()
Copy to Clipboard Toggle word wrap
这​假​设​你​有​一​个​名​为​ DataHelper 的​类​,它​有​一​个​返​回​字​符​串​列​表​(位​于​ classpath 上​)的​方​法​ getListOfAges()。​你​当​然​可​以​将​这​些​ “​动​态​的​“​ 枚​举​和​固​定​列​表​混​合​。​例​如​,你​可​以​用​ JDBC 从​数​据​库​里​加​载​它​们​。​你​第​一​次​在​会​话​里​使​用​ Guided Editor 时​将​加​载​数​据​枚​举​。​如​果​你​有​任​何​打​开​的​ Guided Editor 会​话​,你​将​需​要​关​闭​它​并​重​新​打​开​规​则​才​能​看​到​发​生​的​变​化​。​要​检​查​枚​举​是​否​已​经​加​载​,请​进​入​软​件​包​配​置​屏​幕​。​你​可​以​使​用​"保​存​并​检​验​(save and validate)"软​件​包​,这​可​以​检​查​并​反​馈​任​何​发​生​的​错​误​。​

4.3.15. 高​级​的​枚​举​概​念​

对​于​数​据​枚​举​,你​还​可​以​执​行​一​些​其​他​的​高​级​任​务​。​
取​决​于​字​段​值​的​下​拉​列​表​
假​设​有​一​个​简​单​的​事​实​模​型​,你​有​一​个​名​为​ Vehicle 的​类​,它​有​两​个​字​段​组​成​:"engineType" 和​ "fuelType"。​对​于​ "engineType" 你​希​望​选​择​ "Petrol" 或​ "Diesel"。​现​在​,很​明​显​燃​油​的​选​择​必​须​取​决​于​引​擎​类​型​(对​于​汽​油​我​们​有​ ULP 和​ PULP,而​对​于​柴​油​我​们​有​ BIO and NORMAL)。​我​们​可​以​在​枚​举​表​达​式​里​表​达​这​种​依​赖​关​系​:
 'Vehicle.engineType' : ['Petrol', 'Diesel']
 'Vehicle.fuelType[engineType=Petrol]' : ['ULP', 'PULP' ]
 'Vehicle.fuelType[engineType=Diesel]' : ['BIO', 'NORMAL' ]
Copy to Clipboard Toggle word wrap
这​显​示​了​如​何​通​过​根​据​其​他​字​段​的​值​来​进​行​选​择​。​请​注​意​,一​旦​你​选​择​了​ engineTypefuelType 的​选​项​列​表​就​被​决​定​里​。​
在​程​序​里​加​载​枚​举​
在​某​些​情​况​下​,我​们​胡​会​希​望​从​外​部​数​据​源​(如​关​系​型​数​据​库​)加​载​自​己​的​枚​举​数​据​。​为​此​,你​可​以​实​现​一​个​返​回​ Map 类​型​的​类​。​这​个​ Map 的​键​是​一​个​字​符​串​(就​是​上​面​显​示​的​ Fact.field 名​称​)。​它​的​值​是​一​个​字​符​串​的​ java.util.List。​
public class SampleDataSource2 {

  public Map<String>, List<String>> loadData() {
    Map data = new HashMap();

    List d = new ArrayList();
    d.add("value1");
    d.add("value2");
    data.put("Fact.field", d);

    return data;
 }

}
Copy to Clipboard Toggle word wrap
在​ BRMS 的​枚​举​里​,输​入​下​列​内​容​:
=(new SampleDataSource2()).loadData()
Copy to Clipboard Toggle word wrap
"=" 符​号​表​示​通​过​执​行​你​的​代​码​加​载​数​据​。​
更​多​高​级​的​枚​举​
在​上​面​的​例​子​里​,列​表​里​的​值​会​“​先​”​被​计​算​。​对​于​相​对​静​态​或​小​型​数​据​来​说​,这​是​非​常​足​够​的​。​然​而​,假​设​我​们​有​一​个​国​家​列​表​,而​每​个​国​家​都​有​一​个​州​的​列​表​,而​每​个​州​又​有​自​己​的​地​区​列​表​,地​区​则​有​街​道​列​表​等​等​。​此​时​你​就​会​发​现​这​需​要​大​量​的​数​据​,这​么​大​的​数​据​是​无​法​被​一​次​加​载​的​。​所​以​,可​以​根​据​所​选​的​国​家​来​加​载​列​表​。​
这​种​情​况​可​以​下​列​方​式​解​决​:
'Fact.field[dependentField1, dependentField2]' : '(new com.yourco.DataHelper()).getListOfAges("@{dependentField1}", "@{dependentField2}")'
Copy to Clipboard Toggle word wrap
请​注​意​,只​有​需​要​的​字​段​才​被​指​定​。​而​且​,在​右​边​的​ ":" 符​号​中​,表​达​式​是​用​引​号​括​起​的​。​这​个​表​达​式​只​在​需​要​时​才​会​被​估​值​。​此​时​,它​将​替​代​指​定​的​字​段​的​值​。​这​意​味​着​你​可​以​使​用​图​形​化​用​户​界​面​的​字​段​值​来​驱​动​数​据​库​查​询​,然​后​再​向​下​查​询​数​据​,诸​如​此​类​。​当​加​载​了​规​则​的​下​拉​列​表​后​,列​表​将​根​据​这​些​字​段​进​行​刷​新​。​"depenentField1" 和​ "dependentField2" 是​ "Fact" 类​型​上​的​字​段​名​称​。​它​们​用​于​计​算​作​为​ ”​字​段​“​ 值​显​示​在​下​拉​列​表​里​的​值​列​表​。​

4.4. 状​态​管​理​

BRMS 里​的​每​个​资​产​和​软​件​包​都​有​一​套​状​态​标​记​(status flag)。​这​些​标​记​的​值​可​以​在​ BRMS 的​“​管​理​”​章​节​找​到​。​在​这​里​,你​可​以​添​加​自​己​的​状​态​名​称​。​和​类​别​相​似​,状​态​也​不​会​以​任​何​方​式​影​响​执​行​。​它​们​只​是​提​供​信​息​而​已​。​

注意

不​像​类​别​,资​产​在​某​个​时​刻​只​有​一​个​状​态​。​
状​态​的​使​用​完​全​是​可​选​的​。​你​可​以​采​用​它​们​或​类​别​来​管​理​资​产​的​生​命​周​期​。​

图 4.20. 资​产​状​态​

上​面​的​图​表​描​述​单​个​资​产​的​状​态​变​化​。​这​种​变​化​会​立​即​发​生​;它​不​需​要​单​独​地​保​存​。​
你​也​可​以​修​改​整​个​软​件​包​的​状​态​。​这​会​设​置​软​件​包​自​身​和​属​于​它​的​所​有​资​产​的​状​态​标​记​为​同​一​个​值​。​

4.5. 软​件​包​管​理​

在​ BRMS 里​,你​有​一​个​"知​识​库​(Knowledge Base)",它​包​含​一​个​或​多​个​"知​识​软​件​包​(Knowledge Package)"。​在​用​户​界​面​里​,知​识​软​件​包​通​常​被​简​单​地​称​为​ "软​件​包​."。​

警告

配​置​知​识​软​件​包​通​常​只​进​行​一​次​,它​应​该​由​具​有​开​发​规​则​和​模​型​经​验​的​人​员​来​完​成​。​很​少​有​人​需​要​配​置​知​识​软​件​包​,只​要​配​置​完​毕​,它​可​以​按​需​要​多​次​进​行​复​制​。​软​件​包​配​置​肯​定​是​一​个​需​要​规​则​开​发​经​验​的​技​术​性​任​务​。​
所​有​的​资​产​都​位​于​ BRMS 的​“​软​件​包​”​里​。​软​件​包​就​像​一​个​子​目​录​(它​也​可​作​为​“​命​名​空​间​”​)。​它​和​规​则​资​产​所​在​的​主​目​录​等​同​。​特​别​是​规​则​需​要​知​道​ fact model 和​命​名​空​间​的​性​质​。​

图 4.21. 软​件​包​浏​览​器​(Package Explorer)

上​面​的​图​片​展​示​了​软​件​包​浏​览​器​(Package Explorer)。​点​击​资​产​类​型​将​显​示​对​应​的​一​个​列​表​(对​于​具​有​数​千​个​规​则​的​软​件​包​,这​需​要​几​秒​钟​才​会​显​示​出​来​,因​此​使​用​类​别​来​加​速​浏​览​很​重​要​)。​
总​而​言​之​,虽​然​规​则​(资​产​)可​以​出​现​多​个​类​别​里​,它​们​只​位​于​一​个​软​件​包​内​。​如​果​你​将​ BRMS 当​作​一​个​文​件​系​统​,则​每​个​软​件​包​都​是​一​个​目​录​,而​其​中​的​资​产​就​是​文​件​列​表​。​
软​件​包​管​理​功​能​允​许​你​查​看​知​识​软​件​包​列​表​并​“​扩​展​”​为​每​个​“​类​型​”​的​小​型​列​表​(资​产​可​能​很​多​,所​以​其​中​一​些​进​行​了​分​组​):
资​产​类​型​:
  • 商​业​资​产​(Business Asset):显​示​所​有​“​商​业​规​则​”​类​型​的​列​表​,它​包​括​决​策​表​(Decision Table)、​商​业​规​则​等​。​
  • 技​术​资​产​(Technical Asset):显​示​被​当​作​技​术​性​规​则​的​资​产​列​表​(如​ DRL 规​则​、​数​据​枚​举​以​及​规​则​流​)。​
  • 功​能​(Function):在​ BRMS 里​,你​也​可​以​定​义​功​能​(这​是​可​选​的​)。​
  • DSL:Domain Specific Language 也​可​作​为​资​产​存​储​。​如​果​存​在​(通​常​只​有​一​个​),他​们​将​和​合​适​的​编​辑​器​ GUI 一​起​使​用​。​
  • 模​型​(Model):一​个​软​件​包​需​要​至​少​一​个​模​型​。​它​用​于​规​则​。​

图 4.22. 创​建​新​的​资​产​

你​可​以​使​用​软​件​包​浏​览​器​(Package Explorer)创​建​新​的​规​则​或​资​产​。​有​些​资​产​只​能​通​过​软​件​包​浏​览​器​创​建​。​图 4.22 “创​建​新​的​资​产​” 展​示​了​启​动​该​功​能​的​“​向​导​”​的​图​标​。​

图 4.23. 软​件​包​配​置​

你​需​要​做​的​最​重​要​的​事​情​是​配​置​软​件​包​。​这​个​任​务​涉​及​导​入​规​则​使​用​的​类​并​定​义​全​局​变​量​两​个​方​面​。​进​行​了​修​改​后​,你​需​要​保​存​它​。​此​时​,软​件​包​就​已​经​完​成​配​置​并​准​备​好​进​行​构​建​了​。​例​如​,你​可​以​添​加​一​个​具​有​类​ com.something.Hello 的​模​型​。​然​后​你​将​在​软​件​包​配​置​里​添​加​ import com.something.Hello 并​保​存​修​改​。​

图 4.24. 构​建​软​件​包​

在​导​入​软​件​包​的​类​并​定​义​了​全​局​变​量​后​,你​可​以​构​建​软​件​包​。​软​件​包​包​含​的​资​产​越​多​,构​建​需​要​的​时​间​越​长​。​构​建​成​功​后​,你​将​可​以​为​部​署​创​建​一​个​“​快​照​”​。​此​时​,你​也​可​以​查​看​软​件​包​构​建​时​生​成​的​“​drl”​。​

4.5.1. 导​入​ drl 软​件​包​

你​也​可​以​通​过​导​入​现​有​的​ "drl" 文​件​来​创​建​软​件​包​。​当​你​选​择​创​建​新​的​软​件​包​时​,你​可​以​选​择​上​载​一​个​ .drl 文​件​。​BRMS 将​试​图​解​析​这​个​ drl 并​自​动​创​建​一​个​软​件​包​。​它​里​面​的​规​则​将​作​为​单​个​资​产​保​存​(仍​然​是​ drl 的​文​本​内​容​)。​请​注​意​,要​实​际​上​构​建​软​件​包​,你​需​要​上​载​一​个​合​适​的​模​型​(以​ .jar 形​式​)以​供​检​验​。​这​是​一​个​单​独​的​步​骤​。​

4.6. 版​本​管​理​

在​ BRMS 里​,整​个​知​识​软​件​包​和​单​个​资​产​都​带​版​本​,单​每​个​的​机​制​都​不​太​一​样​。​单​个​资​产​在​源​码​控​制​系​统​(Subversion)里​以​文​件​版​本​的​形​式​保​存​。​然​而​,资​产​软​件​包​通​过​快​照​方​式​根​据​需​要​(“​On Demand”​)划​分​版​本​。​这​个​快​照​用​于​部​署​。​下​一​节​我​们​讨​论​部​署​管​理​和​快​照​的​更​多​细​节​。​

图 4.25. 资​产​版​本​

每​次​对​资​产​进​行​修​改​后​,它​都​在​版​本​历​史​记​录​创​建​一​个​新​的​条​目​。​这​为​你​提​供​了​无​限​制​的​“​Undo”​功​能​。​你​可​以​查​看​单​个​资​产​的​历​史​(如​上​面​的​列​表​所​示​),然​后​按​照​时​间​进​行​恢​复​。​

4.7. 部​署​管​理​

URL 是​围​绕​如​何​提​供​构​建​的​知​识​软​件​包​的​过​程​的​中​心​。​BRMS 通​过​ URL 提​供​知​识​软​件​包​以​供​知​识​代​理​(Knowledge Agent)下​载​和​使​用​。​这​些​ URL 采​用​这​种​格​式​:http://localhost:8080/jboss-brms/org.drools.guvnor.Guvnor/package/<packageName>/<packageVersion>
<packageName> 是​你​给​软​件​包​取​的​名​字​。​<packageVersion> 是​快​照​的​名​称​或​ "LATEST"(如​果​它​是​“​LATEST”​,那​么​它​将​是​从​主​软​件​包​里​构​建​的​最​新​版​本​而​非​快​照​)。​你​可​以​在​代​理​里​使​用​它​或​者​将​其​粘​贴​到​浏​览​器​地​址​栏​里​作​为​文​件​下​载​。​
关​于​如​何​在​应​用​程​序​里​使​用​这​些​ URL 和​二​进​制​下​载​、​以​及​如​何​在​运​行​时​(On the fly)更​新​规​则​的​详​情​,请​参​考​ 第 8.1 节 “知​识​代​理​(Knowledge Agent)”。​

图 4.26. 部​署​快​照​

上​面​的​映​像​展​示​了​ Deployment Snapshots 视​图​。​左​侧​有​一​个​知​识​软​件​包​列​表​。​点​击​某​个​软​件​包​,它​将​为​你​展​示​它​的​所​有​快​照​(如​果​有​的​话​)。​你​可​以​复​制​、​删​除​或​查​看​快​照​。​每​个​快​照​都​可​以​下​载​或​通​过​ URL 访​问​。​下​载​后​你​就​可​以​部​署​它​。​

4.8. 浏​览​库​和​查​找​规​则​

查​看​库​的​两​个​主​要​途​径​是​使​用​用​户​驱​动​的​类​别​(也​称​为​ tagging)和​软​件​包​浏​览​器​(Package Explorer)视​图​。​
分​类​视​图​(Category View)为​你​提​供​了​浏​览​与​你​的​机​构​相​关​的​规​则​的​途​径​。​

图 4.27. 分​类​视​图​(Category View)

上​面​的​图​表​显​示​了​分​类​功​能​。​如​果​可​能​的​话​,将​每​个​类​别​里​的​规​则​限​制​在​几​十​个​以​下​。​
其​他​的​视​图​使​用​软​件​包​浏​览​器​(Package Explorer)。​这​个​视​图​以​反​映​数​据​库​里​实​际​存​储​情​况​的​方​式​显​示​资​产​。​它​也​按​照​类​型​或​格​式​将​规​则​分​开​到​知​识​软​件​包​里​。​

图 4.28. 软​件​包​视​图​

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat