OMG 的 DMN(Decision Model and Notation,决策模型与标记)

1️⃣ DMN 想解决什么问题

在企业或软件开发中,经常有类似这样的需求:

  • “如果客户年龄 < 18 岁,则拒绝贷款”
  • “当温度 > 38℃ 且症状包含咳嗽,则建议做核酸检测”

这些都是决策规则

  • 有输入条件(年龄、温度、症状)
  • 有判断逻辑(比较、与或关系)
  • 有输出结果(批准/拒绝、建议/不建议)

过去这些逻辑要么写在代码里,要么写在文档里,业务人员看不懂代码,开发人员又难以直接使用文档
DMN 的目标是:**用统一的“图形 + 表格 + 逻辑表达”**来描述这些规则,让业务和开发都能理解,并且机器可以直接执行。


2️⃣ DMN 的核心构件

DMN 有三种主要“表示层”:

构件 作用 类比
决策需求图(DRD) 用图形表示各个决策节点及它们的依赖关系 UML 类图/流程图
决策表(Decision Table) 用表格列出条件、判断和结果 Excel 规则表
FEEL 表达式 一种简化的表达式语言,用来描述条件计算 规则中的公式

一个典型的 DMN 模型可以包含:

  • 输入数据<
### DMN 决策模型符号中的命中策略 DMNDecision Model and Notation)是一种用于建模和表示决策逻辑的标准,其核心组件之一是决策表。在 DMN 中,**命中策略(Hit Policy)** 是定义如何处理多个匹配条件的关键机制[^1]。 #### 命中策略的作用 命中策略决定了当输入数据满足多个规则时,应该如何评估这些规则并返回结果。不同的命中策略适用于不同类型的决策场景。例如,在某些情况下可能只需要找到第一个符合条件的结果,而在其他情况下则需要考虑所有可能的匹配项[^4]。 #### 主要的命中策略类型 以下是 DMN 中常见的几种命中策略及其含义: 1. **唯一命中(U, Unique Hit)** - 表示每个输入组合最多只能触发一条规则。 - 如果存在多条规则被激活,则会抛出错误。 - 这种策略通常用于确保每组输入只对应唯一的输出[^3]。 2. **任意命中(A, Any Hit)** - 只需找到第一条匹配的规则即可停止计算。 - 不关心是否有更多规则可以匹配。 - 此策略适合性能敏感的应用场景,因为它允许提前终止不必要的后续规则评估。 3. **全部命中(All, All Hits)** - 返回所有匹配规则的结果集合。 - 需要遍历整个决策表来查找所有的适用规则。 - 当希望获取完整的匹配列表而非单一值时非常有用[^2]。 4. **优先级命中(P, Priority Hit)** - 根据规则顺序依次执行直到遇到首个符合条件者为止。 - 类似于“First Match”,但它强调了基于排列次序的重要性。 5. **收集命中(C, Collect Hit)** - 将所有匹配规则产生的输出通过某种聚合函数(如求和、平均数等操作符)汇总成最终结果。 - 提供了一种灵活的方式来处理复杂的数据转换需求。 6. **规则订单命中(R, Rule Order Hit)** - 按照显式的规则编号或者预设序列逐一检验直至发现合适的选项。 - 和Priority类似但更注重人为指定的先后关系而不是自动推导出来的权重等级. 7. **输出控制命中(O, Output Entry Only Hit)** - 特殊形式下仅关注特定字段或属性作为判定依据而不涉及其余部分的内容比较过程. - 对简化版应用场景特别有效率高且易于维护的特点.[^2] 8. **无命中(NONE, No Matching Rules Found Error Handling Mechanism)** - 定义未找到任何相配情况下的行为模式(比如报错提示或是默认替代方案设定). - 能够增强系统的健壮性和用户体验满意度水平.[^4] #### 实现注意事项 由于 DMN 自身只是一个规范框架,实际部署过程中往往依赖第三方软件产品完成具体功能落地工作。因此开发者应当仔细查阅所选用平台对于上述各类命中政策的支持程度以及潜在差异之处。 ```python # 示例代码展示如何模拟简单版本的"Unique Hit" def unique_hit_decision(input_data, rules): matched_rule = None for rule in rules: if evaluate_condition(rule['condition'], input_data): # 判断当前rule是否符合input_data if matched_rule is not None: raise ValueError("Multiple matching rules found!") # 抛异常表明违反unique原则 matched_rule = rule return matched_rule['action'] if matched_rule else 'No match' rules = [ {'condition': lambda x: x > 10, 'action': 'Greater than ten'}, {'condition': lambda x: x == 5, 'action': 'Equal to five'} ] print(unique_hit_decision(15, rules)) # 输出 "Greater than ten" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pumpkin84514

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值