问题描述
我正在使用使用 DMN 编写的规则使用 drools 进行一些早期实验。
在我的用例中,输入数据可能很大而且多种多样。 还有一些输出可能会在单独调用规则引擎时作为输入传回。
因此,某些输入变量可能与我的某些输出变量具有相同的名称。 这似乎会引起问题。
特别是如果我有一个决策表并且我的输出名称匹配数据输入中的任何内容(无论 DRD 树是否实际访问它),那么 drools 响应会报告错误并且输出值设置为空。>
然而,对于非常动态的数据,这种冲突并不容易预测。
所以我想问:
-
我的观察是否正确?
-
是否有一种通用模式可以避免此类问题(可能是某种 变量命名空间或范围)?
编辑:
- 回复:我的观察是否正确?
我现在可能已经找到了一些 DMN 标准,它描述了为什么输出名称和输入名称不能冲突。我认为图中的最终决策并不特殊,因此考虑到理论上可以存在一个图形,这样任何决策都可以用作以后决策的输入,因此决策输出和相同的输入没有意义图具有相同的名称。
来自标准https://www.omg.org/spec/DMN/1.3/PDF
如上所述,DRG 级别的每个决策、输入数据和业务知识模型都与决策逻辑级别使用的变量相关联。决策表达式引用的每个变量都必须与所需的决策、所需的输入数据或所需的知识相关联。此外,与所需决策、所需输入数据和所需知识相关的每个变量都必须在决策表达式中引用。
• 如果决策需要另一个决策,则所需决策的值表达式会将值分配给变量,以用于评估所需决策。这是 DMN 中用于在决策逻辑级别组合决策的通用机制。
• 如果决策需要输入数据,则在执行时将附加到输入数据的数据源的值分配给变量的值。这是 DMN 中用于实例化决策数据需求的通用机制。
决策的决策逻辑的输入变量不得在该值表达式或其组件值表达式之外使用:决策元素为其决策逻辑定义输入变量的词法范围。为了避免名称冲突和歧义,变量的名称在其范围内必须是唯一的。当 DRG 元素映射到 FEEL 时,变量的名称与其关联的输入数据或决策的(可能限定的)名称相同,这保证了其唯一性。
解决方法
如果我正确理解了您的问题,那么您正在尝试建模 DMN 模型,其中一些 DRGElement (InputData
,Decision
,...) 节点共享相同的名称。
根据 DMN 标准规范,这不符合有效模型,我们已对 kie-dmn-validation
模块进行了检查,该模块会报告此问题。即使在尝试通过 Drools DMN 引擎“编译”DMN 模型之前,该问题也会被报告。
演示:
因此,当您创建 DMN 模型时,如果您不遵守 DMN 标准规范的基本规定,我们会使用验证器模块进行检测,并根据上面的屏幕截图尝试提供合理的用户消息。
请注意,在使用 kie-dmn-validation
使用 Maven 构建 KJAR
时和/或在使用基于 Kogito 的项目的 CodeGen 期间,kie-maven-plugin
也被“嵌入”(因此验证功能相同用于所有构建系统和平台)。