Я работаю над коротким homomorphi c запросом, целью которого является преобразование определенных букв строкового ввода в другие фиксированные буквы.
Например, мне бы хотелось, чтобы все буквы «А» должны быть преобразованы в «Е», а все буквы «Е» - в «О». Я не могу использовать собственные функции 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, это изменить агрегирующую переменную внутри l oop и тогда УСТАНАВЛИВАЙ мои данные. Я пытался использовать оператор WITH
перед моим UNWIND l oop, но мне не удалось сохранить данные внутри переменной.
Редактировать: Мне удалось сделать другую реализацию, но она все еще возвращается и устанавливает слишком много раз. Даже если конечный результат правильный.
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