Как поиск по индексированным свойствам занимает больше времени в запросе шифра 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.

Другие вопросы по тегам