Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/functions/lambda/ Documentation version: v5.3.2 # 匿名函数 本文描述悦数图数据库开发版中的匿名函数用法,适用于持久图和临时图。 匿名函数(也称为 Lambda 函数)允许您定义一个操作,该操作可以将[匿名表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/lambda/)应用于列表中的每个元素。本文介绍接受匿名表达式作为参数的函数。 ## transform() 接受一个列表和一个匿名表达式,并返回一个转换后的新列表,其中每个元素都是通过将匿名表达式应用于原始列表中的相应元素得到的。 NULL 行为:默认 ### 函数签名 ```` transform(l: List, lambda: lambda_value_expr) -> List ```` - `l: List`:要转换的原始列表。 - `lambda: lambda_value_expr`:应用于列表中每个元素的匿名表达式。 - `List`:返回的转换后的列表。新列表中元素的数据类型由匿名表达式定义,新列表中元素的数据类型可以与原始列表中元素的数据类型不同。 ### 示例 #### 将整数列表转换为整数列表,每个元素乘以 2 再加 1 ```` RETURN transform(LIST[1, 2, 3], x -> 2 * x + 1) AS a ```` 返回: ```` +---------+ | a | +---------+ | [3,5,7] | +---------+ ```` #### 使用 CASE 表达式将整数列表转换为整数列表 ```` RETURN transform(LIST[1, 2, 3], x -> CASE WHEN x % 2 = 0 THEN 2 * x ELSE 0 END) AS a ```` 返回: ```` +---------+ | a | +---------+ | [0,4,0] | +---------+ ```` 上述示例使用 CASE 表达式将列表中的偶数元素乘以 2,将奇数元素转换为 0。 #### 将整数列表转换为布尔值列表 ```` RETURN transform(LIST [1, 2, 3], x -> x > 2) AS a ```` 返回: ```` +--------------------+ | a | +--------------------+ | [false,false,true] | +--------------------+ ```` #### 将点列表转换为点 ID 列表 ```` ''' USE movie MATCH p=(m:Movie)<-[e:Watch]-(n@`User`) RETURN transform(nodes(p), x -> x.id) AS a LIMIT 5 ''' ```` 上述示例基于[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)。示例首先匹配路径`p`,然后将路径`p`中的点转换为它们的 ID,并返回前五个转换后的列表。 返回: ```` +-----------+ | a | +-----------+ | [22,143] | | [473,143] | | [298,111] | | [22,111] | | [496,111] | +-----------+ ```` ## filter() 接受一个列表和一个匿名表达式,并返回一个过滤后的新列表,其中包含原始列表中满足匿名表达式的元素。 NULL 行为:默认 ### 函数签名 ```` filter(l: List, lambda: lambda_value_expr) -> List ```` - `l: List`:要筛选的原始列表。 - `lambda: lambda_predicate_expr`:应用于列表中每个元素的匿名表达式。若匿名表达式返回`true`,则在新列表中保留该元素;若匿名表达式返回`false`,则在新列表中移除该元素。 - `List`:返回的过滤后的列表。新列表中元素的数据类型与原始列表中元素的数据类型相同。 ### 示例 #### 从整数列表中筛选出取值大于 2 的元素 ```` RETURN filter(LIST[1, 2, 3], x -> x > 2) AS a ```` 返回: ```` +-----+ | a | +-----+ | [3] | +-----+ ```` #### 从整数列表中筛选出偶数 ```` RETURN filter(LIST[1, 2, 3, 4, 5], x -> x % 2 = 0) AS a ```` 返回: ```` +-------+ | a | +-------+ | [2,4] | +-------+ ```` ## reduce() 将一个匿名表达式应用于列表中的每个元素,进行累积计算,并返回一个值。 NULL 行为:默认 ### 函数签名 ```` reduce( l: list, state: S, input_function: (S, E) -> S ) -> S ```` 或: ```` reduce( l: list, state: S, input_function: (S, E) -> S, output_function: (S) -> R ) -> R ```` - `l: list`:要转换的原始列表。其中,`E`代表列表中任意数据类型的元素。 - `state: S`:初始值。该值会在`input_function`作用于列表中每个元素时被更新。初始值的数据类型可以是任意类型,并且可以与列表元素的数据类型不同。 - `input_function: (S, E) -> S`:应用于列表中每个元素的匿名表达式。 - `output_function: (S) -> R`:(可选)将累积结果转换为输出结果的匿名表达式。 - `S`:将`input_function`作用于列表中每个元素后得到的累积结果,其数据类型与`state`的数据类型相同。 - `R`:将`output_function`作用于累积结果后得到的最终结果,其数据类型可以与累积结果的数据类型不同。 ### 示例 #### 计算整数列表的和 ```` RETURN reduce(range(1,3), 100, (state, item) -> state + item) AS a ```` 返回: ```` +-----+ | a | +-----+ | 106 | +-----+ ```` 以上示例`range(1,3)`生成一个整数列表`[1, 2, 3]`,`reduce()`函数根据匿名表达式`(state, item) -> state + item`将列表中的每个元素累加到初始值`100`上。即返回`100 + 1 + 2 + 3 = 106`。 #### 输入为空列表 ```` RETURN reduce([], 100, (state, item) -> item + 3) AS a ```` 返回: ```` +-----+ | a | +-----+ | 100 | +-----+ ```` 上述示例中,`reduce()`函数的初始值为`100`。由于输入列表为空,匿名表达式`(state, item) -> item + 3`未被应用,累积结果仍为初始值`100`。 #### 使用匿名表达式转换输出结果 ```` ''' RETURN reduce([1, 2, 3, 4], {sum: 0.0, count: 0}, (state, item) -> {sum: state.sum + item, count: state.count + 1}, state -> CASE WHEN state.count = 0 THEN NULL ELSE state END) AS a ''' ```` 返回: ```` +--------------------+ | a | +--------------------+ | {count:4,sum:10.0} | +--------------------+ ```` 上述示例中,`reduce()`函数的初始值为`{sum: 0.0, count: 0}`,`reduce()`函数根据匿名表达式`(state, item) -> {sum: state.sum + item, count: state.count + 1}`将列表中的每个元素累加到`sum`上,并将`count`加 1。最后,匿名表达式`state -> CASE WHEN state.count = 0 THEN NULL ELSE state END`将累积结果经过判断后作为输出结果返回。