介紹
決策表是一種用來表述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)。
單命中表只返回一個規則的輸出。它可以也可以不包含重疊的規則。在重疊規則的情況下,命中策略必須指定選擇哪個匹配的規則。
單命中策略 之 單輸出決策表:
- 不重復( U:Unique):沒有重疊並且所有規則都是互斥的。只有一個規則可以被匹配。這是默認的。
- 任意(A:Any):有可能有重疊,但所有的匹配規則都顯示相同的輸出,所以任何匹配都可以使用。
- 優先級(P:Priority):多個規則可以匹配有不同的輸出。該策略將返回具有最高優先級的輸出匹配規則。輸出優先級是指定了一組值的順序。例如,期望的輸出值的列表。
- 第一個(F:First):多個(重疊)規則可以匹配有不同的輸出。按規則順序第一次命中立即返回(和執行可中斷)。這是一個常見的用法,因為它通過強制第一次命中解決不一致的問題。重要的是要從其他幾個表中區分這種類型的表,關鍵在於該表的意義依賴規則的順序。最后一條規則往往特別有用。因為有順序,這種表很難手工驗證,因此必須謹慎使用。
一個多命中表可以從多個規則中返回輸出項。這個結果將是一組規則輸出或一個函數輸出。
多命中策略 之 單輸出決策表:
- 不排序(N:No order):返回所有的命中,在無序不重復的列表中。
- 輸出順序(O:Output order):返回所有的命中,按照優先級遞減的順序。輸出優先級是指定在一個有序的值列表中。
- 規則順序(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。
決策表只有單個命中時,聚合方式不起作用。
在決策表具有多次命中策略時,聚集提示符的語義:
- collect:決策表中的結果是所有輸出的列表,每個命中策略有序或無序。
- sum:決策表中的結果是所有的輸出的總和。
- min:決策表的結果是所有輸出的最小值。
- max:決策表的結果是所有輸出的最大值。
- count:決策表的結果是輸出的個數。
- 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 |
例子
以下提供了各種類型的決策表的示例,以供在本節討論。