neo4j - Улучшение запроса Cypher - PullRequest
0 голосов
/ 14 октября 2018

У меня есть приложение, критичное к производительности, которое должно сопоставлять несколько узлов другому узлу на основе сопоставления с регулярным выражением.Мой текущий запрос выглядит следующим образом:

MATCH (person: Person {name: 'Mark'})
WITH person
UNWIND person.match_list AS match
MATCH (pet: Animal) 
WHERE pet.name_regex =~ match
MERGE (person)-[:OWNS_PET]->(pet) 
RETURN pet

Однако этот запрос выполняется ОЧЕНЬ медленно (около 500 мс на моей рабочей станции).График содержит около 500 тыс. Узлов, и около 10 тыс. Будет соответствовать регулярному выражению.

Мне интересно, есть ли более эффективный способ переписать этот запрос, чтобы он работал так же, но обеспечил бы повышение производительности.

РЕДАКТИРОВАТЬ:

Когда я запускаю этот запрос для нескольких многопоточных лиц, я получаю TransientError исключение

neo4j.exceptions.TransientError: ForsetiClient[3] can't acquire ExclusiveLock{owner=ForsetiClient[14]} on NODE(1889), because holders of that lock are waiting for ForsetiClient[3].

РЕДАКТИРОВАТЬ 2:

Person:name является уникальным и индексируется

Animal:name_regex не индексируется

1 Ответ

0 голосов
/ 15 октября 2018

Сначала я бы максимально упростил ваш запрос.То, как вы это делаете, теперь создает много потерянных усилий после того, как найдено совпадение

MATCH (person: Person {name: 'Mark'}), (pet: Animal)
WHERE ANY(match in person.match_list WHERE pet.name_regex =~ match)
MERGE (person)-[:OWNS_PET]->(pet) 
RETURN pet

Это позволит сделать так, что будет предпринято только 1 слияние, если есть несколько совпадений, и один раз совпадениенайдено, остальные не будут покушаться на того же питомца.Это также позволяет Cypher оптимизировать ваши данные наилучшим образом.

Для дальнейшего улучшения шифра вам потребуется оптимизировать ваши данные.Например, сопоставление с регулярным выражением стоит дорого (требуется сканирование узла + строки), если операторы сопоставления могут в значительной степени повторно использоваться между людьми, было бы лучше разбить их на узел, а затем подключить к ним так, чтобы работа одногосовпадение с регулярным выражением можно использовать везде, где оно повторяется.

...