Это потому, что $
является персонажем со специальным значением в регулярном выражении. Я не знаю, где Neo4j документирует синтаксис регулярного выражения Cypher (за пределами few examples in the manual). Квалифицированная догадка заключается в том, что $
означает «конец строки», и если вы хотите совместить литерал $
, вам необходимо его избежать. Я попробовал запрос с экранированным $
, но этот запрос не удался.
MATCH (n:Details)
WHERE n.Name =~ '(?i).*\$Swaraj'
RETURN n;
Error: Invalid input '$': expected '\', ''', '"', 'b', 'f', 'n', 'r', 't', UTF16 or UTF32 (line 1, column 44 (offset: 43))
"MATCH (n:Details) WHERE n.Name =~ '(?i).*\$Swaraj' RETURN n;"
Если я удвоил его, запрос будет выполнен.
Query:
MATCH (n:Details)
WHERE n.Name =~ "(?i).*\\$Swaraj"
RETURN n;
возвращает
n
(6:Details {Name:"$$$$Swaraj"})
Два примечания:
1) попытаться найти, где документируется синтаксис регулярных выражений Cypher или вы будете гадать, в темноте. Возможно, это похоже на синтаксис Scala, поскольку Cypher написан на Scala? Если вы не можете найти документацию синтаксиса регулярных выражений Cypher, вы можете попробовать Scala's - по крайней мере, вы будете гадать в сумерках.
2) Последний запрос с удвоенным экранированным $
работает и работает, но когда он отображает выполненный запрос вместе с результатом, он отображает запрос только с одним \
. Это верно в онлайн-режиме console, и это верно также и для запроса, который заполняется для меня для редактирования или выполнения, поэтому, если я снова запустил запрос без изменений, он прерывается.
MATCH (n:Details)
WHERE n.Name =~ '(?i).*\$Swaraj'
RETURN n;
Это означает, что что-то не так, а не только с вашим регулярным выражением, но с тем, как выполняется разбор запроса. Это может быть небольшая ошибка только в веб-приложении (на данный момент у меня нет экземпляра сервера), и, возможно, это не имеет никакого эффекта, кроме запутывания, но обратите внимание на него, если у вас есть проблемы с экранами в регулярных выражениях в будущем.
EDIT
This tutorial содержит полезный список регулярных выражений атомов и примеры для Scala, который, по-видимому такой же, как и для Java.
Он также упоминает двойное экранирование:
Обратите внимание, что появляется каждый обратный слэш дважды в строке выше. Это связано с тем, что в Java и Scala одиночная обратная косая черта является escape-символом в строковом литерале, а не регулярным символом, который отображается в строке. Поэтому вместо. \. вам нужно написать. \\. чтобы получить одиночную обратную косую черту в строке.
NB Я до сих пор не знаю, факт, что Cypher использует регулярные выражения Scala/Java.Я думаю, что это довольно вероятно, но я не знаю.