首页 > 解决方案 > 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

标签: neo4jcypher

解决方案


这应该将每个字符转换为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子句来处理所需的所有字符转换。


推荐阅读