neo4j / Regex: Cypher string REPLACE (), заменяющий сегмент строки только до конца или начала строки - PullRequest
2 голосов
/ 11 февраля 2020

Есть ли в cypher способ ЗАМЕНИТЬ (n.propertyvalue, {search}, {replace}), где есть еще несколько условий для {search}, например, от начала строки до разделителя или от разделителя до конца строки?

Например, где {search} равен 123, а {replace} равно 000:

CREATE (n:TEST) set n.SWAP_ID="1234_12314123_123";
CREATE (n:TEST) set n.SWAP_ID="123_1312323_1234";
CREATE (n:TEST) set n.SWAP_ID="12434_12314123_123";
CREATE (n:TEST) set n.SWAP_ID="1243_123_1123";
MATCH (n:TEST) set n.WAS_ID=n.SWAP_ID
SET n.SWAP_ID=REPLACE (REPLACE (REPLACE (n.SWAP_ID, '_'+ {search} + '_' , '_'+{replace}+ '_'), '_'+ {search} + '\\$' , '_'+{replace}) , '\\^'+ {search}+'_', {replace}+'_') 
return n.WAS_ID, n.SWAP_ID;

Я хотел бы:

n.WAS_ID                     n.SWAP_ID
"1234_12314123_123"         "1234_12314123_000"
"123_1312323_1234"          "000_1312323_1234"
"12434_12314123_123"        "12434_12314123_000"
"1243_123_1123"             "1243_000_1123"

Но я получаю:

n.WAS_ID                     n.SWAP_ID
"1234_12314123_123"         "1234_12314123_123"
"123_1312323_1234"          "123_1312323_1234"
"12434_12314123_123"        "12434_12314123_123"
"1243_123_1123"             "1243_000_1123"

Конец строки и начало строки не распознаются. Похоже, что Cypher должен быть в состоянии сделать это базовые c регулярные выражения, верно?

Похоже, это произошло 5 лет go: Neo4j переименовать свойство с использованием регулярного выражения текущего значения свойства Заменить регулярные выражения в cypher

Все еще не исправить?

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Спасибо NonameCurious!

apo c .text.replace заменяет каждый экземпляр любого регулярного выражения в подстроке регулярного выражения. Я не проверял его с параметрами, но это будет что-то вроде:

MATCH (n:TEST)
SET n.SWAP_ID=apoc.text.replace (apoc.text.replace (REPLACE(n.WAS_ID, '_'+{search}+'_', '_'+{replace}+'_'), "(_"+{search}+"$)" , "_"+{replace}), "(^"+{search}+")" , {replace} + "_")

Добавление: не работает с параметрами, но работает без параметров.

1 голос
/ 12 февраля 2020

Как насчет этого:

apoc.text.replace(apoc.text.replace(apoc.text.replace(n.WAS_ID, "_" + {search} + "_","_" + {replace} + "_"), "^" + {search} + "_",{replace} + "_"),"_" + {search} + "$","_" + {replace})

Если у вас не установлен плагин APO C, вам нужно сделать это в первую очередь.

0 голосов
/ 13 февраля 2020

Существует регулярное выражение, которое будет обрабатывать все ваши крайние случаи, и вам нужно будет выполнить только одну операцию замены:

SET n.SWAP_ID = apoc.text.replace(
  n.SWAP_ID,
  '(^|(?<=_))' + $search + '($|(?=_))',
  $replace)

Пояснение

апо * 1032 Функция * .text.replace просто использует метод Java String.replaceAll , поэтому поддерживается любое регулярное выражение, соответствующее документированному шаблону .

Для вашего конкретного c варианта использования это регулярное выражение должно работать хорошо:

(^|(?<=_))123($|(?=_))
  • Шаблон (^|(?<=_)) ищет либо начало входной строки, либо подчеркивание, но любое совпадение подчеркивание не будет заменено.
  • Шаблон ($|(?=_)) ищет конец входной строки или подчеркивание, но любое совпадающее подчеркивание не будет заменено.
  • Кроме того, эти шаблоны разрешить рассматривать одно и то же подчеркивание несколько раз (например, в строке "123_123", как в качестве завершающего, так и в качестве нижнего подчеркивания).

Например, этот запрос :

UNWIND [
  "1234_12314123_123",
  "123_1312323_1234",
  "12434_12314123_123",
  "1243_123_1123",
  "123_123_123",
  "123"
] AS x
RETURN x, apoc.text.replace(x, "(^|(?<=_))123($|(?=_))", "000") AS y

дает такой результат:

╒════════════════════╤════════════════════╕
│"x"                 │"y"                 │
╞════════════════════╪════════════════════╡
│"1234_12314123_123" │"1234_12314123_000" │
├────────────────────┼────────────────────┤
│"123_1312323_1234"  │"000_1312323_1234"  │
├────────────────────┼────────────────────┤
│"12434_12314123_123"│"12434_12314123_000"│
├────────────────────┼────────────────────┤
│"1243_123_1123"     │"1243_000_1123"     │
├────────────────────┼────────────────────┤
│"123_123_123"       │"000_000_000"       │
├────────────────────┼────────────────────┤
│"123"               │"000"               │
└────────────────────┴────────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...