DMN决策表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DMN决策表
介绍
决策表是⼀种⽤来表述DRD中Decision决策逻辑的⽅式。
决策表是⽤表格形式表⽰⼀组相关联的输⼊和输出表达式,组织成规则,说明⼀组特定的输⼊项所适⽤的输出项。
决策表包含所有(仅)⽤于确定输出的输⼊项。
此外,⼀个完整的表包含输⼊值(所有的规则)的所有可能组合。
使⽤决策表和表层次结构在表现决策逻辑时有较好效果。
规范化不同形式和类型决策表是DMN的⽬的之⼀。
⼀个决策表包含:
名称
⼀组输⼊,每个输⼊(可选)关联⼀个类型与⼀组输⼊值
⼀组输出,每个输出(可选)关联⼀个类型与⼀组输出值
⼀组在表中的⾏或列的规则(取决于⽅向),其中每个规则组成的表⾏(或列)的特定输⼊项和输出项
决策表显⽰规则使⽤⼀种速记符号,通过排列条⽬在表格单元格中:
在以上决策表⽚段的三个突出显⽰的单元格表⽰以下规则:
IF input expression 1 matches x AND input expression 2 matches y THEN a result (a "hit") is z.
如果"输⼊表达式1"匹配了"x",并且"输⼊表达式2"匹配了"y",则结果(⼀次命中)是"z"
这样简写在每个规则中都以相同的顺序显⽰所有的输⼊,因此有⼀些可读性和验证的优势。
⼀组规则描述了决策的逻辑。
如果规则允许包含重复输⼊组合,该表的命中策略需要提⽰重复规则如何被解释,以避免不⼀致。
规则列表中可能包含了输⼊值的所有可能性组合,在这种情况下,该表被称为"完整(complete)"。
标记符号
本节是建⽴在决策逻辑通⽤符号和boxed表达式基础之上。
决策表表⽰规范:
⽅向(⾏式,列式或交叉表),如图所⽰的表
放置输⼊、输出和⼀组值(可选)在表格单元格中的标准位置
线条样式和可选⾊彩的运⽤
特定规则的输⼊和输出项单元格的内容
命中策略,提⽰如何解释重复的输⼊组合
聚合,说明如何将多个命中聚集
表名、命中策略(H)、完整性提⽰器(C)、聚合(A)和规则号的位置
线的样式和颜⾊
线条样式是标准的。
输⼊部分和输出部分之间是加粗线(double line),并且输⼊/输出和规则项单元格之间是加粗线(double line)。
其它单元格是通过普通线(单线)隔开。
建议有颜⾊,但不影响意义。
使⽤不同的颜⾊⽤于输⼊、输出和规则值,这被认为是很好的做法。
表格⽅向
根据⼤⼩,决策表可呈⽔平⽅向(⾏规则)、垂直(列规则)或交叉表(从两个输⼊维度组成的规则)。
交叉表只能有默认的命中策略(见下⽂)。
表格的排列⽅式必须以下的⼀种:(单元格标签中的斜体部分是可选的,如果设置了允许值范围则显⽰)
交叉表是允许超过两个以上的输⼊项。
(只是这⾥没有显⽰)
输⼊表达式
输⼊表达式通常是简单的,例如:⼀个名称(客户状态)或⼀个测试(年龄<25)。
表达式可以是任意⽂本(如,⾃然语⾔⽂本)但是不应与FEEL语法冲突。
输⼊值
输⼊表达式可以预期结果是⼀个有限的数据或是⼀个有限的取值范围。
重要的是对期望值进⾏建模,如果它的规则涵盖预期输⼊值的所有组合,⼀个决策表可以被认为是完整的。
不管如何对预期的输⼊值进⾏建模,输⼊值都应该是排他的,完整的。
排他(Exclusive)表⽰输⼊值不重叠。
完整(Complete)是指从域中所有相关的输⼊值都包括在内。
例如,下⾯的两个输⼊值范围重叠:<5,<10。
下⾯的两个范围是不完整的:<5,>5。
⼀组输⼊值是可选的。
如果提供,它是⼀组⼀元测试,必须要求相应的输⼊的测试值为真(true)。
该列表可以是任何⽂字(例如,⾃然语⾔⽂本),但不应该与FEEL语法冲突。
表格名称和输出名称
表格名称或输出名称必须指定。
如果指定了表格名称,输出名称必须和表格名称相同,或者不指定(空box的单输出表,或者省略"box"的多输出表)。
如果表名未指定,则输出名称必须指定。
输出值
⼀个决策表的输出项通常是由⼀组输出值绘制。
当多个规则被匹配时,这组输出值排序可以⽤来指定优先级,最终仅有⼀个会被命中并被返回。
当命中的策略是输出顺序时,排序也可以被使⽤。
这组输出值是可选的。
如果提供,它是⼀个列表,限制输出项的值为在给定列表的值。
这个列表可以是任何⽂字(例如,⾃然语⾔⽂本),但不应该与FEEL语法冲突。
多输出
决策表可以展现出⼀个复合输出
输⼊项
规则输⼊项是表达式。
该表达式可以是任何⽂本(如⾃然语⾔⽂本),但不应该与FEEL语法冲突。
破折号符号(' - ')可以⽤来指任何输⼊值,即输⼊与规则⽆关。
⼀元测试的值应该是' - '或指定的输⼊值的⼦集。
例如,如果对输⼊'年龄'的输⼊值指定为[0 ..120],接着输⼊条⽬<0时应当报告为⽆效。
表包含' - '被称为约定表。
其他被称为扩展。
表中每⼀个输⼊项为真,假,或' - '历来称为有限表,但这⾥没有必要维持这⼀限制。
评估表达式在决策表中不产⽣负⾯影响。
输⼊项顺序在实现时不关联到任何执⾏顺序。
合并输⼊实体单元格
不同规则的相邻输⼊项单元格,并且有相同内容和相同次序的单元格可以合并。
规则输出单元不能合并(除交叉表)
输出项
规则输出项是表达式。
该表达式可以是任何⽂本(如⾃然语⾔⽂本),但不应该与FEEL语法冲突。
垂直表(列规则)与⼀个单输出名称是和表名相同,⼀个速记符号可以被⽤来表⽰:输出适⽤(X)或不适⽤( - ),这是决策表的常见做法。
命中策略
决策表可以具有多个规则,并且通常多于⼀个规则可以被匹配⾄⼀组给定的输⼊。
命中策略指定了决策表的结果,在这样的情况下还包含了可⽤于在设计时要检查是否正确的附加信息。
为清楚起见,命中策略是在⼀个特定的决策表单元使⽤的单个字符摘要。
⼯具可以⽀持命中策略的⼀个⼦集,但表类型必须是清晰的,因此命中策略指⽰为强制性的。
命中策略必须默认为不重复。
⽤不重复命中决策表不包含重叠的输⼊项的规则。
如果规则允许包含重叠的输⼊项,那么命中策略得要说明这些重叠的规则如何解释。
单命中表只返回⼀个规则的输出;多命中表可能会返回多个规则的输出(或函数的输出,如数值sum)。
单命中表只返回⼀个规则的输出。
它可以也可以不包含重叠的规则。
在重叠规则的情况下,命中策略必须指定选择哪个匹配的规则。
单命中策略之单输出决策表:
1. 不重复( U:Unique):没有重叠并且所有规则都是互斥的。
只有⼀个规则可以被匹配。
这是默认的。
2. 任意(A:Any):有可能有重叠,但所有的匹配规则都显⽰相同的输出,所以任何匹配都可以使⽤。
3. 优先级(P:Priority):多个规则可以匹配有不同的输出。
该策略将返回具有最⾼优先级的输出匹配规则。
输出优先级是指定了⼀组值
的顺序。
例如,期望的输出值的列表。
4. 第⼀个(F:First):多个(重叠)规则可以匹配有不同的输出。
按规则顺序第⼀次命中⽴即返回(和执⾏可中断)。
这是⼀个常见的
⽤法,因为它通过强制第⼀次命中解决不⼀致的问题。
重要的是要从其他⼏个表中区分这种类型的表,关键在于该表的意义依赖规则的顺序。
最后⼀条规则往往特别有⽤。
因为有顺序,这种表很难⼿⼯验证,因此必须谨慎使⽤。
⼀个多命中表可以从多个规则中返回输出项。
这个结果将是⼀组规则输出或⼀个函数输出。
多命中策略之单输出决策表:
1. 不排序(N:No order):返回所有的命中,在⽆序不重复的列表中。
2. 输出顺序(O:Output order):返回所有的命中,按照优先级递减的顺序。
输出优先级是指定在⼀个有序的值列表中。
3. 规则顺序(R:Rule order):返回所有的命中,根据规则顺序。
注意:意义取决于规则的顺序。
其他策略,如在输出上做更复杂的操作,可以通过后处理输出列表来执⾏(外部决策表)。
以上命中策略的单个字母也标识出这个决策表是单命中还是多命中的。
为了降低复杂性,决策表与复合输出仅⽀持以下命中政策:Unique,Any,First,No order和Rule order。
注意事项1
交叉表是通过定义保证唯⼀性和完整性的,所以不需要命中策略来标识。
注意事项2
除了在First tables (单命中) 和Rule order tables (多命中)中,其他的决策表中的规则顺序是不影响其意义的。
所以这两种表应当谨慎使⽤。
完整性提⽰
表的完整性是⼀个可选属性。
默认情况下,表是完整的,为每⼀种可能的情况产⽣⼀个结果。
如果没有提⽰器应认为是不完整的。
不完整的表格可以指定⼀个默认的输出。
聚合
多次命中必须被合并为⼀个单⼀的结果。
DMN1.0指定了六个聚集⽅式,即:collect, sum, min, max, count, average。
可选地,所述聚合提⽰符可以被包括在表中。
默认为collect。
决策表只有单个命中时,聚合⽅式不起作⽤。
在决策表具有多次命中策略时,聚集提⽰符的语义:
1. collect:决策表中的结果是所有输出的列表,每个命中策略有序或⽆序。
2. sum:决策表中的结果是所有的输出的总和。
3. min:决策表的结果是所有输出的最⼩值。
4. max:决策表的结果是所有输出的最⼤值。
5. count:决策表的结果是输出的个数。
6. average:决策表的结果是所有的输出的平均值,定义为sum除以count,其中sum和count语义是上⾯定义的。
其他策略,例如在输出更复杂的操作,可以通过后处理的输出列表(外决策表)来进⾏。
元模型
决策表元模型
DMN 1.0中,类DecisionTable是⽤来对决策表建模的。
DecisionTable是Expression的⼀个实现。
DecisionTable实例包含⼀组rules,它是DecisionRule实例;还有⼀组clauses,它是Clause实例。
它有⼀个preferedOrientation属性,它必须是集合中的⼀个:DecisionTableOrientation: Rule-as-Row, Rule-as-Column或CrossTable。
DecisionTable实例应当如preferedOrientation指定的形式呈现。
DecisionTable实例有⼀个关联的hitPolicy,它必须是集合中的⼀个:HitPolicy: UNIQUE, FIRST, PRIORITY, ANY, UNORDERED, RULE ORDER, OUTPUT ORDER。
hitPolicy属性的默认值是:UNIQUE。
在DecisionTable实例的⽰意图中,hitPolicy是按照命中策略章节定义来表现的。
DecisionTable实例的语义是依赖于他关联的hitPolicy,它已在命中策略章节中描述。
如果DecisionTable实例关联的hitPolicy是:FIRST或RULE ORDER,DecisionTable所关联的rules必须是ordered。
顺序是在DecisionTable的图形展现中表⽰规则的明确的编号。
如果DecisionTable实例关联的hitPolicy是:PRIORITY 或OUTPUT ORDER,DecisionTable的条款中的outputEntry也必须是有序的,以及这些outputEntries必须被关联作为DecisionTable规则的结论。
DecisionTable的图形表⽰,执⾏的顺序是按照命中策略章节定义来表现的。
DecisionTable实例有⼀个关联的aggregation,它是BuiltinAggregator集合中的⼀个值。
默认值是COLLECT。
作为Expression的⼀种类型,DecisionTable实例有⼀个值,依赖于关联的rules、hitPolicy、aggregration(或其他)的结论。
DecisionTable实例的值是根据下⾯的规范来确定:
hitPolicy是UNIQUE,DecisionTable实例的值是:仅适⽤规则的结论(conclusion)值。
(参见决策规则,规则适⽤的定义)
hitPolicy是FIRST,DecisionTable实例的值是:第⼀个适⽤规则的结论(conclusion)值,根据规则顺序。
hitPolicy是PRIORITY,DecisionTable实例的值是:第⼀个适⽤规则的结论值,根据其结论(conclusion)条款(clause)的输出项(outputEntry)顺序。
hitPolicy是ANY,DecisionTable实例的值是:所有适⽤规则的结论(conclusion)值。
hitPolicy是UNORDERED,DecisionTable实例的值是:结果应⽤聚合函数处理所有适⽤的规则,通过DecisionTable的aggregation属性对⼀组结论值不做排序。
hitPolicy是RULE ORDER,DecisionTable实例的值是:结果应⽤聚合函数处理所有适⽤的规则,通过DecisionTable的aggregation 属性对⼀组结论的值根据规则顺序排序。
hitPolicy是OUTPUT ORDER,DecisionTable实例的值是:结果应⽤聚合函数处理所有适⽤的规则,通过DecisionTable的
aggregation属性对⼀组结论的值根据结论中clause的outputEntry顺序排序。
DecisionTable有个可选Boolean属性:isComplete。
如果DecisionTable实例有isComplete属性,当DecisionTable不完整时,这个属性的值必须是false。
仅当所有DecisionTable的inputVariables绑定是有效的,才可以说⼀个DecisionTable实例是完整的。
⾄少⼀个DecisionTable规则是适⽤的。
DecisionTable有个可选Boolean属性:isConsistent。
如果DecisionTable实例有isConsistent属性,该属性的值必须是false,除⾮DecisionTable是⼀致的。
仅当所有DecisionTable的inputVariables绑定是有效的,所有适⽤的规则具有相同的值,才可以说⼀个DecisionTable实例是⼀致的。
DecisionTable从Expression中集成了所有属性和模型关联。
clause: Clause [*]该属性列出Clause实例,它构成DecisionTable
rule: DecisionRule [*]该属性列出DecisionRule实例,它构成DecisionTable
hitPolicy: HitPolicy命中策略决定了DecisionTable的语义。
默认是:UNIQUE
aggregation: BuiltinAggregator聚合功能应⽤到适⽤的rules值上,当它是超过⼀个,决定DecisionTable的值。
默认是COLLECT
isComplete: Boolean [0..1]如果存在,这个属性必须是false,除⾮这DecisionTable是完整的。
默认:false isConsistent: Boolean [0..1]如果存在,这个属性必须是false,除⾮这DecisionTable是⼀致的。
默认:false
preferedOrientation:DecisionTableOrientation [0..1]DecisionTable图形展现的优先⽅向,DecisionTable应与该属性指定的表现⼀致。
决策表条款元模型(Clause)
在⼀个决策表中,⼀个条款指定⼀个主题,这是由⼀个输⼊表达式或输出域中定义,以及有限数量主题域的⼦域集,他们是⼀块决策逻辑相关的,是描述决策表的。
在DMN 1.0中,类Clause是⽤来对决策表条款建模的。
Clause实例是由⼀个可选的inputExpression和⼀组inputEntry,或⼀个可选的名字和⼀组outputEntry组成,它是Expression实例。
⼀个Clause元素如果已经有了⼀个inputExpression则必须有⼀组inputEntry,如果它没有inputExpression则必须有⼀组outputEntry,⼀个Clause元素不允许同时拥有inputEntry 和outputEntry。
Clause实例可以有⼀个String类型的name,并且可以引⽤⼀个outputDefinition,它是ItemDefinition元素。
⼀个Clause实例An instance of Clause that does not have an inputExpression MUST reference an outputDefinition。
⼀个Clause实例包含⼀个inputExpression,不能引⽤⾃outputDefinition。
如果Clause元素引⽤⼀个outputDefinition没有name,他默认的name就是引⽤的ItemDefinition元素的名称。
inputEntry元素的valueDefinition必须是Boolean并且它可以被省略。
inputEntry元素必须检测它的值包含clause的inputExpression,尽可能隐式的。
outputEntry的valueDefinition必须是outputDefinition或包含clause的outputDefinition继承实现类,它可以被省略:如果outputEntry 的valueDefinition 被省略了,它默认为包含clause的outputDefinition。
在⼀个表格显⽰的DecisionTable中,Clause实例显⽰依赖于决策表的⽅向。
举例来说,如果决策表⽔平展现(⾏规则),Clause实例表现为列,带有inputExpression或Clause元素的name,展现在最上⾯的单元格,它的值域可选的列在单元格下⾯,并且每个单元格下⾯展现Clause的⼀个inputEntry 或者outputEntry。
所有由⼀组inputEntry组成的Clause 实例都在左侧,任何由⼀组outputEntry组成的Clause必须展现在右侧。
inputExpression: Expression [0.1]这个输⼊clause的主题
outputDefinition: ItemDefinition [0.1]这个输出clause的范围
name: String [,0.1]这个输出clause的名称
inputEntry: Expression [*]这个属性列出Expression实例,他组成这个clause
outputEntry: Expression [*]这个属性列出Expression实例,他组成这个clause
决策表规则元模型(Rule)
在DMN 1.0中,类DecisionRule是⽤来对决策表中的规则建模的。
DecisionRule实例有⼀组conditions和⼀组不为空的conclusions,他们都是Expression实例。
DecisionRule实例的条件(condition)是引⽤Expression实例,必须关联到⼀个本决策表包含的clause中的inputEntry。
相同
的,DecisionRule实例的结论(conclusion)也是引⽤Expression实例,必须关联到⼀个本决策表包含的clause中的outputEntry。
DecisonRule元素在相同的clause中不允许有超过⼀个结论(conclusion)。
在⼀个表格显⽰的DecisionTable中,DecisionRule展现依赖于决策表的⽅向。
举例来说,如果决策表是横向展现的(⾏规
则),DecisionRule实例作为⾏展现,所有的条件(conditions)展现在所有结论(conclusions)的左边。
根据定义,⼀个DecisionRule元素没有condition表⽰总是应⽤。
否则,应给clauses的condition的inputExpressions设置⼀组
值,DecisionRule实例,⼀个DecisionRule实例被认为是适⽤的(applicable)仅当每⼀个Clause元素包含⾄少⼀个规则的condition,⾄少⼀个规则的condition是包含在Clause元素时,返回true。
相同的,在逻辑⽅⾯,DecisionRule元素被认为是适⽤的(applicable),如果结合是true,其中有⼀个结合每⼀个Clause元素,他最少有⼀个inputEntry被DecisionRule元素引⽤作为⼀个条件,并且每个结合是分离所有规则条件,它是包含在相同的Clause元素中的。
condition: Expression [*]这个属性列出Expression实例,他组成这个DecisionRule的condition
conclusion: Expression [1..*]这个属性列出Expression实例,他组成这个DecisionRule的conclusion
例⼦
以下提供了各种类型的决策表的⽰例,以供在本节讨论。