Как поиск по индексированным свойствам занимает больше времени в запросе шифра Neo4j
Существует связь между сущностью и узлом Addess. Сущность имеет уникальное ограничение ключа на eid, а Address имеет уникальное ограничение ключа на addressLocation. У меня есть миллионы узлов для сущности и адреса. Точный запрос на поиск работает нормально, и вот запрос -
match(e:Entity)-[r]->(a:Address) where a.addressLocation="ABC XYZ" return r
Но, как поисковый запрос занимает слишком много времени, что приводит к ReadTimeOutException. Вот запрос -
match(e:Entity)-[r]->(a:Address) where a.addressLocation=~".*(?i)ABC XYZ.*" return r
Может кто-нибудь сказать мне, что я должен сделать, чтобы получить как результат поиска так же быстро, как точный результат поиска.
1 ответ
Первый запрос использует поиск по индексу (на Address.addressLocation
):
match(e:Entity)-[r]->(a:Address) where a.addressLocation="ABC XYZ" return r
Второй запрос использует регулярное выражение, которое не может использовать индекс и, следовательно, не очень производительно:
match(e:Entity)-[r]->(a:Address) where a.addressLocation=~".*(?i)ABC XYZ.*" return r
Cypher имеет три оператора сравнения строк STARTS WITH
, ENDS WITH
а также CONTAINS
, STARTS WITH
будет использовать индекс, поэтому этот запрос должен выполняться:
MATCH (e:Entity)-[r]->(a:Addres)
WHERE a.addressLocation STARTS WITH "ABC XYZ"
RETURN r
ENDS WITH
а также CONTAINS
(что действительно то, что вам нужно) в настоящее время не использует индекс, однако в Neo4j 3.0 оба будут использовать индекс. Если вы хотите попробовать ее, на странице загрузки доступна версия 3.0.