将流口水与 DMN 一起使用时,输入/输出变量名称冲突是否是预期问题?如果是,我该如何最好地避免它们?

如何解决将流口水与 DMN 一起使用时,输入/输出变量名称冲突是否是预期问题?如果是,我该如何最好地避免它们?

我正在使用使用 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 模型之前,该问题也会被报告。

演示:

Duplicate node name result in error screenshot

因此,当您创建 DMN 模型时,如果您不遵守 DMN 标准规范的基本规定,我们会使用验证器模块进行检测,并根据上面的屏幕截图尝试提供合理的用户消息。

请注意,在使用 kie-dmn-validation 使用 Maven 构建 KJAR 时和/或在使用基于 Kogito 的项目的 CodeGen 期间,kie-maven-plugin 也被“嵌入”(因此验证功能相同用于所有构建系统和平台)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?