2012-12-11 5 views
39

Wygląda na to, że LIKE nie jest obsługiwane w zapytaniach Cyphera.Klauzula LIKE w CYPHER Zapytanie

Czy istnieje inny konstrukt, który wykonałby to samo zadanie?

Na przykład:

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

refcard jest naprawdę przydatna rzecz do zakładki: http://neo4j.com/docs/cypher-refcard/current/ Wymienia wszystkie obsługiwane ciąg pasujący operatorów na przykład. –

Odpowiedz

49

za pomocą wyrażeń regularnych: http://neo4j.com/docs/developer-manual/current/#query-where-regex

start n = node(*) where n.Name =~ '.*SUBSTRING.*' return n.Name, n; 
+3

Obawiałem się, że odpowiedzią może być regex. Groans;) Mimo to sprawia, że ​​jest on potężniejszy niż zwykły LIKE – johnc

+2

tak, jestem także zaniepokojony regexp, ale jest to teraz bezpośrednia droga. ale nadal możesz używać indeksu luceńskiego w następujący sposób: 'start n = node: your_index ('property: * SUBSTRING *') return n.name, n;' – ulkas

+4

i użyj parametrów zamiast wartości literalnych: 'start n = node (*) gdzie n.Nazwa = ~ {like} return n.Nazwa, n; 'params: {" jak ":". * PODKRETNA. * "}, również węzeł (*) jako podpowiedź do klauzuli startowej na nie-wykresie use-case, a następnie raczej użyj sugestii wyszukiwania indeksów ulkas –

16

Począwszy od wersji 2.0, preferowanym składni używa MATCH.

np.

MATCH (n) where n.Name =~ '.*SUBSTRING.*' return n.Name, n; 
+0

, ale '= ~ 'PRJ \ d'' nie wydaje się działać – ekkis

+0

nieważne. '= ~ ​​'PRJ \\'' działa poprawnie. Muszę uciec – ekkis

13

Jeśli chcesz, aby to sprawa niewrażliwe

MATCH (n) WHERE n.name =~ '(?i).*SUBSTRING.*' RETURN n; 
+0

tak, ale wydajność jest do bani! – ekkis

+0

Bardzo dziękuję :) – JochemQuery

5

Brak konieczności Wyrażenia regularne:

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

idź do the cypher refcard i przewiń w dół do sekcji orzeczników. Znajdziesz to i inne przydatne rzeczy.

Chcesz bez uwzględniania wielkości liter? Konwersja do małymi literami:

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

Niestety, wielkość liter jest rozróżniana i nie ma wersji bez rozróżniania wielkości liter. ugh! – ekkis

+0

Naprawiono @ekkis, patrz edycja. –

+0

tak, to zadziała, podobnie jak "= ~" (? I) substring'', ale nie działa dobrze. lower() zapobiega używaniu indeksu, więc na dużych danych po prostu się zawiesi. Mam otwartą prośbę o funkcję tutaj: https://github.com/neo4j/neo4j/issues/9450 – ekkis