Neo4J Cypher - УСТАНАВЛИВАЙТЕ данные ОДИН РАЗ после их обработки в цикле - PullRequest
1 голос
/ 14 января 2020

Я работаю над коротким 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

1 Ответ

2 голосов
/ 14 января 2020

Это должно преобразовать каждый символ в 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 для обработки всех необходимых преобразований символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...