Предложение LIKE в запросе CYPHER

Похоже, что LIKE не поддерживается в запросах Cypher.

Есть ли другая конструкция, которая выполняла бы ту же задачу?

Например:

start n = node(*) where n.Name LIKE('%SUBSTRING%') return n.Name, n;

person johnc    schedule 11.12.2012    source источник
comment
Рефкарту действительно удобно добавлять в закладки: neo4j.com/docs/cypher-refcard/current Например, в нем перечислены все поддерживаемые операторы сопоставления строк.   -  person F Lekschas    schedule 04.05.2017


Ответы (4)


с использованием регулярных выражений: http://neo4j.com/docs/developer-manual/current/#query-where-regex

start n = node(*) where n.Name =~ '.*SUBSTRING.*' return n.Name, n;
person ulkas    schedule 12.12.2012
comment
Я волновался, что регулярное выражение может быть ответом. Стонет;) Тем не менее, это делает его мощнее простого LIKE - person johnc; 12.12.2012
comment
да, меня тоже беспокоит регулярное выражение, но теперь это прямой путь. но вы все равно можете использовать индекс lucene следующим образом: start n=node:your_index('property:*SUBSTRING*') return n.name, n; - person ulkas; 12.12.2012
comment
и, пожалуйста, используйте параметры вместо буквальных значений: start n = node(*) where n.Name =~ {like} return n.Name, n; params: {like:. * SUBSTRING. *}, а также node (*) в качестве начального предложения, намекающего на вариант использования без графа, а затем используйте предложение поиска по индексу ulkas - person Michael Hunger; 19.12.2012
comment
Похоже, он не работает с. * SUBSTRING. *, А только с ^. * SUBSTRING. * $ - person clement; 26.05.2015
comment
@MichaelHunger Таким образом, в SDN-репозитории, имеющем. * В аргументе вместо запроса, вынуждает нас объединить их на уровне обслуживания, если мы не можем разместить их в @Query (MATCH (m: Neo4JManufacturer), где LOWER (m .name) = ~ LOWER ('{searchTerm}') RETURN m ORDER BY m.name) общедоступный список ‹Neo4JManufacturer› поиск (@Param (searchTerm) String searchTerm); Это правильное предположение? - person Stephane; 11.09.2015
comment
Я надеялся создать открытый список @Query (MATCH (m: Neo4JManufacturer), где LOWER (m.name) = ~ LOWER ('. * {SearchTerm}. *') RETURN m ORDER BY m.name) ‹Neo4JManufacturer› поиск (@Param (searchTerm) String searchTerm); но это дает мне: Незаконное повторение рядом с индексом 1. * {searchterm}. * - person Stephane; 11.09.2015
comment
У меня он работал с репозиторием LOWER (m.name) = ~ LOWER ({searchTerm}) и службой с searchTerm =. * + SearchTerm +. *; - person Stephane; 11.09.2015

Начиная с версии 2.0, в предпочтительном синтаксисе используется MATCH.

e.g.

MATCH (n) where n.Name =~ '.*SUBSTRING.*' return n.Name, n;
person Ryan Walls    schedule 09.10.2014

Регулярные выражения не нужны:

start n = node(*) where n.Name contains "substring" return n.Name, n;

Перейдите к cypher refcard и прокрутите вниз до раздела Предикаты. Вы найдете это и другие полезные вещи.

Хотите регистр без учета регистра? Преобразовать в нижний регистр:

start n = node(*) where lower(n.Name) contains lower("substring") return n.Name, n;
person Community    schedule 15.03.2017
comment
к сожалению, он чувствителен к регистру и нет версии без учета регистра. фу! - person ekkis; 28.05.2017
comment
да, это будет работать, как и =~ '(?i)substring', но не очень хорошо. нижний () предотвращает использование индекса, поэтому на больших данных он просто зависает. У меня есть открытый запрос функции здесь: github.com/neo4j/neo4j/issues/9450 - person ekkis; 03.06.2017

Если вы хотите сделать его нечувствительным к регистру

MATCH (n) WHERE n.name =~ '(?i).*SUBSTRING.*' RETURN n;
person arikan    schedule 09.10.2014