设为首页 | 收藏本站
185 1521 8668

FEEL操作符说明

发表时间:2025-04-03 09:08作者:Together规则引擎
文章附图

尽管DMN的表达语言FEEL 被设计为对商业友好,但它仍然让许多人望而生畏。这导致了经常听到的指责,即“DMN对企业用户来说太难了”。事实并非如此,至少对于那些愿意学习如何使用它的人来说是这样。尽管 Microsoft Excel Formula 语言实际上不如 FEEL 对业务友好,但不知何故,您从未听说过“Excel 对业务用户来说太难了”。

FEEL 比 Excel Formula 语言(他们现在称为 Power FX)对业务更友好的一个关键原因是它的运算符。FEEL有很多,而Power FX很少。在这篇文章中,我们将讨论什么是运算符,它们如何简化表达式语法,以及 DMN 盒装表达式如何使一些 FEEL 运算符更容易被业务用户理解。

值得重申的是,表达式语言与编程语言不同。编程语言有语句。它定义变量,计算和分配其值。您可以将 DMN 作为一个整体称为编程语言,但表达式语言 FEEL 不定义变量或分配其值。这些事情以图形方式完成,在图表和表格中 - DRD 和盒装表达式。FEEL 表达式只是计算值的公式:数据值输入,数据值输出。

函数和运算符

这些公式基于两个主要构造:函数和运算符。

函数的逻辑在函数定义中根据称为参数的输入指定。只需调用具有不同参数值(称为参数)的函数,即可重用相同的逻辑。函数调用的语法(在 FEEL 和 Excel 公式中)是函数名称,后面紧跟括号,括起来以逗号分隔的参数列表。FEEL提供了一长串内置函数,这意味着函数名称及其参数由语言本身定义。Excel 公式也是如此。此外,DMN 允许建模者以业务知识模型(BKM)和决策服务的形式创建自定义函数,这是 Excel 在没有编程的情况下不允许的。

运算符基于表达式中的保留词和符号,其含义由表达式语言本身定义。没有用户定义的运算符。它们不使用名称后跟括号括起来的语法,括起来是参数列表。因此,使用运算符的表达式的语法通常比使用函数的表达式更短、更简单、更易于理解。

你可以从FEEL中的几个例子中看到这一点,在这些例子中,你可以使用一个函数或一个运算符。一种是简单的加法。使用 sum() 函数比较添加变量 a 和 b 的表达式的语法

sum(a, b)

使用加法运算符 + 的等效项:

a + b

FEEL 函数 list contains()和in运算符执行相同的操作,测试列表中值的包含。比较

list contains(myList, "abc")

"abc" in myList

FEEL 和 Excel 都支持基本的算术运算符(如 +、-、* 和 /)、比较运算符(如 =、> 或 <=)以及字符串连接。但这些基本上是 Excel 提供的唯一运算符,而 FEEL 提供了更多运算符。正是有了这些更复杂的运算符,FEEL的商业友好性优势就脱颖而出。

if..then..else

让我们从条件运算符if..then..else这些关键字构成了FEEL中的运算符,Excel只能使用函数。比较 FEEL 表达式

if 信用评分 = "" and 可负担性 = "OK" then "批准" else "反对"

Excel 基于函数的等效项:

IF(AND(信用评分 = "", 可负担性 = "OK"), "批准", "反对")

长度大致相同,但FEEL更易于人类阅读。当然,Excel表达式假定您已经为单元格分配了一个变量名称——这是没有人这样做的。因此,您更有可能看到如下内容:

IF(AND(B3 = "", C3 = "OK"), "批准", "反对")

这是一个微不足道的例子。一个更现实的if..then..else可能是

if 信用评分 = "" and 可负担性 = "OK" then "批准"

        else if 信用评分 = "" and 可负担性 = "一般" then "转介"

        else "拒绝"

这更长,但仍然是人类可读的。将其与 Excel 公式进行比较:

IF(AND(信用评分 = "", 可负担性= "OK"), "批准", IF(AND(信用评分 = "",可负担性= "一般"), "转介", "拒绝"))

尽管FEEL语法相当简单,但DMN包含一个条件盒装表达式,该表达式在单独的单元格中输入if、then 和 else 表达式,理论上使运算符对某些用户更友好,而不像代码。使用该盒装表达式,上面的逻辑如下所示:

操作符1.png

筛选器

FEEL筛选器运算符是括起来的方括号,将布尔表达式或整数表达式括起来,紧跟在列表之后。当包含的表达式为布尔值时,筛选器将从表达式为 true 的列表中选择项。当封闭的表达式的计算结果为正整数 n 时,筛选器将选择列表中的第 n 项。(对于负整数 n,它选择从末尾向后计数的第 n 个项目。在实践中,要筛选的列表通常是一个表,一个表示表记录的行列表,布尔表达式引用该表的列。专项_DMN中的查找表的上下文中写过这个问题。正如我们当时所看到的,如果可变银行利率是可用抵押贷款产品的表格,如下所示:

操作符2.png


然后是筛选器

银行利率[借方名称 = "Citibank"]

从此表中选择 Citibank 记录。实际上,布尔过滤器总是返回一个列表,即使它只包含一个项目,因此要从该列表中提取记录,我们需要附加第二个整数过滤器 [1]。所以正确的表达式是

银行利率[借方名称 = "Citibank"][1]

Excel 公式不包括筛选器运算符,但再次使用函数:FILTER(table, condition, else value)。因此,如果我们将单元格 A2:D11 分配给名称银行利率,将列 A2:A11 分配给名称借方名称,则等效的 Excel 公式将是

FILTER(银行利率, 借方名称 = "Citibank", "")

但更有可能被输入为

FILTER(A2:D11, A2:A11 = "Citibank", "")

FEEL的优势在多个查询条件下变得更加明显。例如,FEEL中的零点/零费用贷款产品列表是

银行利率[点数 = 0 and 费用 = 0]

而在 Excel 中,您需要使用

FILTER(A2:D11, (C2:C11=0)*(D2:D11=0), "")

毫无疑问,FEEL对商业更友好。

for..in..return运算符遍历输入列表并返回输出列表。这意味着对于输入列表中的每个项目,我们为其分配了一个虚拟范围变量名称,计算返回表达式的值:

for <range variable> in <input list> return <return expression, based on range variable>

将范围变量(也称为迭代器)命名为什么并不重要,只要它不与模型中的真实变量名称冲突即可。通常只使用像x这样的通用内容,但命名范围变量以建议列表项使表达式更易于理解。在最常见的迭代形式中,输入列表是表示列表或表的某个表达式,而范围变量是该列表或该表中的行中的项。

例如,假设我们要处理上面的银行利率表,并使用请求的贷款金额 400,000 元创建一个新表借方付款金额,其中包含借方名称每月付款金额列。假设我们有一个BKM借款人付款金额,其参数为贷款产品申请金额,它创建了新表的一行,该结构包含借方名称每月付款金额组件。我们将使用if..then..else运算符。每次迭代都会创建一行借方付款金额,因此最后我们将有一个完整的表格。

操作符3.png

贷方付款的字面表达式

for 产品 in 银行利率 return 借方付款(产品,申请金额)

这里的产品是范围变量,表示一行 Bankrates,正如我们之前看到的,这是一个具有四个分量的结构。银行利率是我们迭代的输入列表。BKM借方付款是返回表达式。初学者有时会被这种字面上的表达吓倒,所以,就像if..then..else,DMN 会提供一个迭代器盒装表达式,用于在单独的单元格中输入 for、in 和 return 表达式。

操作符4.png

BKM借款付款使用上下文框表达式(没有最终结果框)来创建表的每一行。上下文条目“每月还款”调用另一个 BKM,即贷款摊销公式,该公式根据调整后的贷款金额、利率和费用计算值。

操作符5.png

Excel公式不包括迭代函数。Power FX 的 FORALL 函数提供迭代,但在Excel中不可用。若要在Excel中循环访问表达式,需要在电子表格中填写。

FEEL运算符some..in..satisfiesevery..in..satisfies满足表示另一种类型的迭代。range 变量和输入列表与for..in..return相同。但在这些表达式中,satifies 子句是一个布尔表达式,迭代运算符返回的不是列表,而是简单的布尔值。如果任何迭代都返回 true,则带有 some 的返回 true,而具有every返回 true 仅当所有迭代都返回 true 时。

例如,再次使用银行利率

some product in 银行利率 satisfies product.点数 = 0 and product.费用 = 0

返回 true,而

every product in 银行利率 satisfies product.点数 = 0 and product.费用 = 0

返回 false。迭代器盒装表达式也适用于此运算符。

底线是这样的:FEEL运算符是其表现力和商业友好性相结合的关键,超过了Microsoft Excel Formulas。建模者不应该被它们吓倒。

文章分类: DMN建模
分享到:
精选文章
公众号
关于我们
联系方式
让您的业务更自动化、智能化!
联系邮箱:   zhangy@jee-soft.cn       wangyl@jee-soft.cn
185 1521 8668
183 3562 2627
联系电话: