2015-08-04 3 views
2

Я не получаю данные в поиске, тогда как для той же строки я получаю данные в точном соответствии. Моя строка поиска начинается со специальных символов.Данные не поступают, как поиск в Neo4j

запроса Строки:

match (n:Details) where n.Name='$$$$Swaraj' return n; //This is working 
match (n:Details) where n.Name=~ '(?i).*$$$$Swaraj.*' return n; //This is not working 

Что проблема в запросе? Спасибо заранее.

ответ

4

Это потому, что $ является персонажем со специальным значением в регулярном выражении. Я не знаю, где 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.Я думаю, что это довольно вероятно, но я не знаю.

2

Таким образом, я думаю, что знаки доллара являются специальными символами в регулярных выражениях Cypher. Вы должны использовать параметр для любых потенциальных динамических данных:

match (n:Details) where n.Name =~ {name_expression} return n; 

Реализация будет варьироваться от языка к языку, но вы бы тогда проездом в качестве параметра. Вам нужно будет избежать знаков доллара, и поэтому вы передадите строку в таком виде:

"(?i).*\\$\\$\\$\\$Swaraj.*"