neo4j - Neo4J Cypher - 在循环处理后设置一次数据
问题描述
我正在研究一个简短的同态查询,旨在将字符串输入的某些字母转换为其他固定字母。
例如,我希望将所有字母“A”转换为“E”,并将所有“E”转换为“O”。我不能使用顺序本机 replace() 函数,因为会发生以下情况:
Input : LEA
replace n°1: LEE
replace n°2: LOO
期望输出与获得的输出:LOE / LOO
所以我决定逐个字母处理,循环遍历我的字符串字符。在下面的示例中,我将所有“E”转换为“O”:
MATCH (...stringToReplace..)
UNWIND range(0,size(apoc.text.split(stringToReplace,'',0))-1) AS i
SET stringToReplace = CASE
WHEN apoc.text.split(stringToReplace,'',0)[i] = 'E'
THEN substring(stringToReplace,0,i) + "O" + substring(stringToReplace, i+1, size(apoc.text.split(stringToReplace,'',0))-1)
ELSE stringToReplace
END
RETURN stringToReplace
我遇到的问题是,我将有尽可能多的 SET 查询,因为字符串有字母。我认为就性能而言,这很蹩脚。
我想要的,我不确定在 Cypher 中是否可行,是修改循环内的聚合变量,然后设置我的数据。我试图WITH
在我的 UNWIND 循环之前使用一个语句,但没有设法将数据存储在一个 var 中。
编辑:我设法做了一个不同的实现,但它仍然返回并设置了太多次。尽管最终结果是对的。
MATCH (...stringToReplace...)
UNWIND range(0,size(apoc.text.split(stringToReplace,'',0))-1) AS i
WITH CASE
WHEN apoc.text.split(stringToReplace,'',0)[i] = 'a'
THEN substring(stringToReplace,0,i) + "i" + substring(stringToReplace, i+1, size(apoc.text.split(stringToReplace,'',0))-1)
ELSE stringToReplace
END AS outputString, stringToReplace
SET stringToReplace = outputString
RETURN stringToReplace
解决方案
这应该将每个字符转换为stringToReplace
MATCH (...stringToReplace..)
RETURN REDUCE(s = '', c IN split(stringToReplace,'') |
s + CASE c
WHEN 'A' THEN 'E'
WHEN 'E' THEN 'O'
ELSE c
END
) as result
只需添加更多WHEN
/THEN
子句来处理所需的所有字符转换。
推荐阅读
- rust - 在 Cargo.toml 中定义货物配置文件的特征
- reverse-engineering - 找不到绘图者 'qwingraph.exe' ida
- javascript - 交互式弹出/空白
- kotlin - 复用关闭的 Kotlin 的 Channel
- qt - 在 Visual Studio 2017 中使用和安装 libVlc 或 GStreamer for QT
- vb.net - 我想使用 Regex.IsMatch 在 VB.net Visual Basic 中查找 TB、GB、MB
- forms - 在 vue 中重置验证
- mysql - 无法使用 psycopg2 在 postgres 中创建临时表
- asp.net - 由于构造函数 ASP:NET Core,控制器无法访问其他项目中的控制器
- gist - 无法在介质中使用要点