上一章节介绍了决策模型的决策依赖层:一个或多个DRD组成一个DRG,可用于对一个领域的决策结构进行建模。然而,每个决策如何从输入得到结果的细节必须建立在决策逻辑层之上。本章节介绍了决策逻辑与决策依赖之间作用(DRG元素)的原理。决策逻辑的具体表现会在:决策表、S-FEEL和FEEL表达式章节详细介绍。
在DMN决策模型的决策逻辑层,由一个或多个表达式组成。在DMN 1.0中,决策逻辑建模元素为:文本表达式(值表达式),决策表和调用:
决策模型中的决策逻辑,主要包括DRG中一些决策模型元素中的 值表达式 组件:
决策逻辑层的另一个关键组件是"变量":变量是用来表示值表达式的输入值的:输入值关联到变量上,值表达式引用变量。变量连接DRG的信息依赖到决策逻辑层的值表达式:
决策逻辑层的第三个关键元素是item definition,它用来在决策模型中描述数据项的类型和结构:DRG的数据输入元素 以及 在决策逻辑层的变量和值表达式,可以引用一个相关的item definition,用它描述预期允许输入的变量、表达式执行结果的数据类型和结构。
请注意,在决策逻辑层,知识源不显示出来:知识源是决策逻辑档案的一部分,不是决策逻辑本身。
决策之间的依赖是需要信息源和业务知识模型,表现为DRG中的信息和知识依赖,并规定了这些元素关联的值表达式如何相互关联的。
如上所述,在DRG层的每个信息依赖是成对(变量和表达式)关联到决策逻辑。决策表达式中引用的每个输入变量必须是在信息依赖中的变量,并且每个决策的信息依赖中的变量必须是决策表达式的输入变量。表达式是关联 信息依赖中的变量的值 到 执行决策的表达式对应值到变量:
决策逻辑的输入变量不能用在值表达式或DRD组件值表达式之外:决策元素定义了该决策逻辑输入变量的作用域。为了避免命名冲突和模糊性,一个变量的名称必须是在其范围内是唯一的。当DRG元素映射到FEEL,变量的名称会与它关联的数据输入或决策的名称相似(可能受限),必须保证其唯一。
当DRG元素映射到FEEL,在DRG中所有的决策和数据输入定义了一个上下文环境(context),这是文本表达式,表示决策元素关联的逻辑以及表示的范围。决策的信息依赖元素是在关联的上下文环境中的上下文环境实体,这里的关键是信息依赖中定义的变量名,并且表达式就是上下文环境,信息依赖引用关联依赖的决策或者数据输入元素。值表达式关联决策就像是决策逻辑一样,是在上下文环境实体中的表达式中指定上下文环境的结果。
以同样的方式,业务知识模型元素定义了其参数的作用域,也就是说,这是该函数主体的输入变量。
在FEEL中,文本表达式和作用域结构表示:业务知识模型元素的逻辑是一个函数定义。其中形参是业务知识模型元素中参数的名称,表达式是值表达式它是业务知识模型元素的主体。
如果一个业务知识模型元素依赖一个或多个其它的业务知识模型,它必须有一个明确的值表达式,描述依赖的业务知识模型是如何被调用、并且合并结果,或采用其他方式描述。
在决策逻辑层,一个决策通过执行业务知识模型的值表达式(参数绑定到输入值)调用一个依赖的业务知识模型。如何实现依赖、决策逻辑是如何从决策和业务知识模型分离的:
值表达式用来绑定一个业务知识模型的参数,它指定了值如何从调用的决策输入变量中获得并传递给该参数。
使用类型调用的值表达式没有限制,甚至在任何可能的情况下:FEEL为更复杂的用法设定了它的调用机制,一个FEEL文本表达式总是可以用类型调用的值表达式来代替。
我们定义了叫做Boxed表达式的决策逻辑图形符号。这个符号的作用是将决策逻辑模型分解成小块,可与DRG部件相关联。DRD加上Boxed表达式形成了一个完整的、大多是图形语言的全面决策模型。
除了Boxed表达的一般概念,本节规定了两种Boxed表达式:
决策表的Boxed表达式定义在下一章讲解,FEEL中其他类型Boxed表达式定义,也在后续会讲解。
Boxed表达式是允许递归的,即Boxed表达式可以包含其他Boxed表达式。顶层Boxed表达式对应于单个DRG部件的决策逻辑。Boxed表达式必须有一个名称框包含DRG的名称部件。名称框可以附着在单个框的上方,如下图:
或者,在名称框和表达式框可以用空格分开,并在左侧以虚线连接,如下图:
名称为DRD元素和Boxed表达式之间定义的唯一视觉联系。图形化的工具将支持适当的图形化的联系,例如,点击一个决策形状打开一个决策表。Boxed表达式如何在视觉上与DRD元素关联,留给了各个实现。
在一个Boxed表达式中,一个文本表达式是由它的文本表示的。但提供了两个符号约定用于改善Boxed文本表达式的可读性:排版字符文本、排版日期和时间文本。
一段文字例如:"拒绝"可以被表示为斜体文字拒绝。
为了避免HIGH, DECLINE 是"HIGH", "DECLINE" 或是 "HIGH, DECLINE",排印字符串文字应该仅是由 ","字符分隔。FEEL排印字符串文字必须符合语法规则27(名称)
日期、时间、日期及时间或者持续时间表达式,如date("2013-08-09")可以被表示为粗斜体文本2013-08-09。文字必须遵循FEEL表达式中指定的语法。
Invocation是一个容器,为执行一个业务模型主体的参数绑定提供上下文环境。
Invocation的体现是业务知识模型与参数绑定显示出列表的名字。
作为一个Boxed表达式,invocation是通过一个外框包含业务知识模型将被调用的名称表示,并列出所有绑定的列表,其中每个绑定是通过在连续两个boxed表达式来体现:左边的框包含一个参数的名称,右侧的框包含绑定表达式,即,表达式的值被分配到参数上,其目的用于执行所调用的业务知识模型(见图25)。
调用的业务知识模型是由业务知识模型的名称表示。任何其他可视化联动是留给实现。
在DMN中,决策和业务知识模型的一个重要特征是,他包含一段表达式用来描述:模型化的决策应如何执行的逻辑 或 一个逻辑块。
在DMN 1.0中,Expression类是所有表达式的抽象基类,在DMN模型中用来描述完整的或者部分的决策逻辑,并在解释执行时返回单个值。
DMN 1.0定义了三个Expression实现类:LiteralExpression, DecisionTable和 Invocation。
一个表达式可以引用变量,这样表达式的值在解释时,依赖于分配给引用变量的值。在DMN1.0,类 InformationItem用于表达式中的变量建模。
表达式的值,如,分配给一个变量的值,可以有结构和一系列的允许值。在DMN 1.0, 类ItemDefinition被用于数据结构和范围建模。
在DMN中,决策和业务知识模型的一个重要特征是,他包含一段表达式用来描述:模型化的决策应如何组成的逻辑 或 一个逻辑块。
在DMN 1.0中,Expression类是所有表达式的抽象基类,在DMN模型中用来描述完整的或者部分的决策逻辑,并在解释执行时返回单个值。
Expression是DMNElement的一个抽象实现,它继承了id和可选属性name和description。
Expression实例直接或者间接的是决策元素、业务知识模型元素、项目定义元素的组成部分,或它是另一个表达式实例的组成部分。表达式元素的id 在所包含的决策、业务知识模型或项目定义实例中是必须唯一。
Expression实例引用0至多个inputVariables是InformationItem实例。inputVariables的有效范围是在Expression实例内,范围的定义是通过决策实例所包含的信息依赖元素,或业务知识模型所包含的参数。包含在ItemDefinition实例中的Expression元素不能引用任何inputVariable。
Expression实例引用了一个可选的itemDefinition,这是ItemDefinition实例指定的可选值的范围。
Expression实例可以解释为从给inputVariables赋值直到获得一个结果值。Expression元素的值是从给inputVariables赋值到它所属的具体Expression实现中得到的。
表达式继承自DMNElement的属性和模型关联。
属性 |
描述 |
inputVariable: InformationItem [*] |
该属性列出InformationItem实例,它其中没有Expression |
itemDefinition: ItemDefinition [0..1] |
Expression的值必须符合ItemDefinition的实例。 |
inputClause: Clause [0..1] |
如果Expression在决策表实例中是一个inputEntry元素,它包含Clause实例 |
outputClause: Clause [0..1] |
如果Expression在决策表实例中是一个outputEntry元素,它包含Clause实例 |
在DMN中,决策的输入和输出是数据项的值,在决策逻辑层,由值表达式赋值给变量或展现。
决策模型中数据项的重要特征是他们的结构。DMN不需要此数据结构中的特定格式,但它并指定FEEL的一个子集作为其缺省值。
在DMN1.0中, 类ItemDefinition用于结构、输入的值的范围和决策的结果进行建模。
就像是其他的DMNElement实现一样,一个ItemDefinition实例有id和可选的name和description属性。Id属性在整个定义中必须唯一。
所有元素的默认类型语言可以通过typeLanguage属性,在Definitions元素节点设定。例如,typeLanguage:http://www.w3.org/2001/XMLSchema表示Definitions元素中使用的数据结构是XML Schema types形式。如果没有特别指定,默认是FEEL。
请注意,建立在typeLanguage的数据类型是关联到Definitions实例,并且没有在ItemDefinition元素中重新定义:他们是被导入的,并且可以在DMN元素中的Definitions元素引用。
类型语言可以在ItemDefinition元素中的typeLanguage属性被覆盖。
请注意,同样的,数据类型和结构是定义在顶层的数据模型中,它通过Import元素导入相关联的Definitions实例,可以不用再重新定义在导入的Definitions中的ItemDefinition元素:他们是被考虑导入并可以引用在DMN中的Definitions元素。
ItemDefinition元素可以设置属性typeDefinition,它是一个字符串。定义数据结构使用typeLanguage或typeRef,他也是一个字符串,他引用一个内建的数据类型在关联的typeLanguage或类型或数据结构定义在顶层外部文档使用typeLanguage:在后一种情况,这个外部文档必须是已经被导入在Definitions元素,他包含ItemDefinition实例,使用Import元素。例如:由XML schema提供数据结构的情况下,Import可以指定这个schema的文件路径,并且typeRef属性可以引用导入的schema中定义的类型或者元素。
默认情况下,ItemDefinition的name是类型的名称,它是定义在它的typeDefinition属性或引用自它的typeRef属性。ItemDefinition元素必须保证不能同时出现typeDefinition属性和typeRef属性。
如果类型语言是FEEL,那么内建类型包括:number, string, boolean, duration, time 和date and time。
ItemDefinition元素可以通过allowedValue属性限制输入值仅允许是来自typeDefinition或typeRef中定义的:每一个allowedValue是一个Expression实例,它指定单个或一组允许的来自typeDefinition或typeRef中定义值。allowedValues中的itemDefinition必须包含ItemDefinition元素自身,也可以省略。如果ItemDefinition元素包含一个或多个allowedValues,allowedValues的列表指定可选值的完整选择范围。如果ItemDefinition没有包含任何allowedValue,那么它的取值范围是所有typeRef或typeDefinition定义的类型。
如果ItemDefinition元素值的允许范围是一个集合,那么可以设置isCollection属性,该属性默认是false。
另一种方式去定义一个ItemDefinition实例,是做为其他多个ItemDefinition元素的组合。ItemDefinition元素可以引用0至多个itemComponentRef,它也是ItemDefinition元素:ItemDefinition元素的范围内的每个值,引用至少一个itemComponentRef给出一个值在范围内每个引用的itemComponentRef元素。
ItemDefinition元素必须通过以下的一种方式来定义:
一个ItemDefinition元素引用了itemComponentRef元素时则不能再有typeDefinition、typeRef、allowedValues属性了。相应的,ItemDefinition元素有了typeDefinition或typeRef属性,则不能再引用任何itemComponentRef。如上面已经提到的,ItemDefinition元素不能同时拥有typeDefinition属性和typeRef属性。
属性 |
描述 |
typeDefinition: String [0..1] |
这个属性用来为ItemDefinition定义有效的基础数据结构 |
typeRef: String [0..1] |
这个属性是用来标识此ItemDefinition的基本类型 |
typeLanguage: String [0..1] |
这个属性标识类型语言用来指定此ItemDefinition基本类型。此值将覆盖在定义元素中指定的类型的语言。该语言必须在URI格式指定。 |
allowedValue: Expression [*] |
这个属性列出Expression元素,它定义一个或者一组的基本类型,是在该ItemDefinition中被允许的。 |
itemComponentRef: ItemDefinition [*] |
这个属性列出了组成这个ItemDefinition的ItemDefinition元素 |
IsCollection: Boolean |
此标志设置为true,表示此ItemDefinition定义的实际值是集合类型。默认值为false |
在DMN 1.0中,类InformationItem是用来在决策逻辑层对变量建模。
InformationItem是DMNElement的实现类,继承了id和可选的name、description属性,但InformationItem必须要有name属性,它是用来表示它在其他Expression元素的名称。
InformationItem元素的name属性必须在其范围内唯一。
在DMN中,变量代表了被输入到决策的值;在决策逻辑描述中,值是传递到决策逻辑的模型,就像是函数定义(表现为一个业务知识模型)。在第一种情况下,变量是实现,在决策逻辑层的一个决策中的信息依赖(决策依赖层)。在第二种情况下,变量是函数的一个参数,它是实现,在决策逻辑层的业务知识模型元素。
因此,InformationItem元素必须是InformationRequirement 中的是变量,或者是BusinessKnowledgeModel的参数;他不能并存。InformationItem 元素的范围是Decision内,它包含在InformationRequirement元素或BusinessKnowledgeModel元素中。
InformationRequirement实例中的变量必须是一个在Decision元素中的决策逻辑里的inputVariable。变量在BusinessKnowledgeModel实例中必须是在BusinessKnowledgeModel元素中valueExpression的inputVariable。
InformationItem 是Expression的一个具体实现,它可以解释和分配一个值。具体做法:
在任何情况下,itemDefinition元素是与InformationItem实例相关联的,必须与itemDefinition兼容,关联到DMN模型元素并从中取值。
属性 |
描述 |
valueExpression: Expression[0..1] |
该Expression的值赋给这个InformationItem。这是一个派生属性 |
informationRequirement:InformationRequirement [0..1] |
InformationRequirement的实例中,这InformationItem是一个组成部分,如果有的话。 |
itemDefinition: ItemDefinition[0..1] |
ItemDefinition的实例,该本InformationItem的返回值必须符合该类型要求。 |
在DMN1.0,类LiteralExpression用于值表达式建模,指定的值通过文字在某些指定的表达式语言中。
LiteralExpression是Expression的实现类,继承了id、inputVariable和itemDefinition属性。
LiteralExpression实例有一个可选的text,它是String类型;还有一个可选的expressionLanguage,它是String类型,用来标识这text的表达式语言。如果expressionLanguage没有指定,这text的表达式语言就是包含其的Definitions元素所制定的expressionLanguage。expressionLanguage必须用URI格式指定,默认语言是FEEL。
作为Expression的子类,每个LiteralExpression实例都有一个value。根据LiteralExpression的expressionLanguage的语义,LiteralExpression实例由text计算出了它的value。DMN 1.0决策模型在本规范中描述的语义仅适用于LiteralExpression的所有模型实例的text都在其相关的表达式语言有效表达。
LiteralExpression的实例可能包括一个导入项,Import实例用于标识所在的LiteralExpression的text是存在的。LiteralExpression实例必须不能同时有text和import。导入项的importType必须与LiteralExpression元素的expressionLanguage一样。
LiteralExpression继承Expression的所有属性和模型关联。
属性 |
描述 |
text: String [0..1] |
这LiteralExpression的text。它必须是expressionLanguage可以解释的有效的表达式。 |
expressionLanguage: String [0..1] |
此属性标识此LiteralExpression使用的表达式语言。此值将覆盖DRD的包含实例指定的表达式语言。该语言必须在URI格式指定。 |
import: Import [0..1] |
Import实例用于指定LiteralExpression的text是存在的。 |
调用是一种机制,它允许:执行一个值表达式 ,被调用表达式在另一个值表达式里面,调用的表达式通过bing本地调用的表达式的输入变量来调用表达式中的值。在一个调用中,调用表达式的输入变量通常被称为:参数。调用允许相同的值表达式重复使用在多个表达式中,而不必复制它作为一个子表达式在所有使用的表达式中。
在DMN中,类Invocation是用来对调用建模的一种Expression:Invocation是Expression的一个具体实现,从它继承了ID,inputVariable和valueDefinition属性。
Invocation实例是由0至多个绑定组成,他们是Binding实例。对调用表达式的参数是如何绑定到Expression实例所调用的inputVariables进行建模。
Invocation实例引用calledFunction,这是要调用的Expression实例。
Invocation实例的值是与之关联的calledFunction的值,其inputVariables在运行时在Invocation中为每个bindings赋值。
Invocation可以被用来对决策模型中的调用建模,当一个Decision元素有一个knowledgeRequirement元素,并且当决策逻辑在Decision元素只调用业务知识模型元素,可以不需要在决策逻辑中通过requiredKnowledge引用它或编写更复杂的值表达式。
使用Invocation实例作为Decision元素的决策逻辑,允许重用一个业务知识模型实例的主体作为任何Decision实例的逻辑,它依赖业务知识模型,其中每个需要的Decision元素指定它自己为该业务知识模型元素的parameters的binding。
与Invocation元素相关联的calledFunction必须是业务知识模型元素的主体,它的依赖是通过Decision元素包含Invocation;该calledFunction是派生属性。Invocation元素必须为每个业务知识模型的parameter有一个binding。
Invocation继承Expression的所有属性和模型关联。
属性 |
描述 |
calledFunction: Expression |
由Invocation调用Expression。他必须由依赖的决策实例包含这个Invocation,调用业务知识模型元素的函数主体。这是一个派生属性 |
binding: Binding [*] |
此属性列出在这个调用中所使用Binding的实例,绑定calledFunction的inputVariables。 |
在DMN1.0,在一个Invocation元素中,类Binding是用来在被调用的表达式给调用表达式的输入变量的自由变量或参数绑定来建模的。
Binding 实例有一个bindingFormula,它是一个Expression实例,以及一个引用的参数,它是InformationItem的一个实例。
Binding元素中的bindingFormula的inputVariables必须是其父级元素Invocation实例中inputVariables的一个子集。
在Binding元素中引用的parameters必须是BusinessKnowledgeModel元素的参数之一,其存在于Invocation实例中调用的calledFunction元素内。
当执行Invocation元素,每个InformationItem元素作为一个参数被引用,在运行时,bindingFormula的值通过Invocation元素的binding赋值。
属性 |
描述 |
parameter: InformationItem |
该InformationItem上的Invocation实例拥有的calledFunction取决于绑定此Binding。 |
bindingFormula: Expression [0..1] |
Expression实例的参数在其所属的Invocation实例被执行是绑定这个Binding |