У меня возникли чрезвычайно высокие времена запросов, и я не могу точно определить проблему.Невероятно высокое время запроса
У меня есть база данных графа с 6685 узлами, 26407 свойствами и 22921 отношениями, работающими на экземпляре Amazon EC2 с 1.7 ГБ оперативной памяти.
Мой вариант использования - это сопоставление людей с их различными точками интереса и поиск для данного пользователя, которые являются людьми, которые имеют с ним общие интересы.
У меня есть данные о 500 человек в моем дБ, и каждый человек имеет в среднем чуть более 100 различных точек интереса, связанных с ним.
1) При запуске этого CYPHER запроса:
START u=node(5) MATCH (u)-[:interests]->(i)<-[:interests]-(o) RETURN o;
Здесь узел (5) представляет собой пользовательский узел. Итак, я пытаюсь найти всех пользователей, у которых одинаковое отношение «: интересов» с пользователем (u).
Этот запрос возвращает 2557 строк и занимает около 350 мс.
2) Когда я посыпаю несколько дополнительных условий MATCH, время запроса экспоненциально ухудшается.
Для например, если я хочу, чтобы найти всех пользователей, которые имеют общие интересы с пользователем (и) = узел (5), а также одни и те же родном городе, я писал:.
START u=node(5)
MATCH (u)-[:interests]->(i)<-[:interests]-(o)
WITH u,o,i
MATCH (u)-[:hometown]->(h)<-[:hometown]-(o)
RETURN u, o, i, h;
Это возвращение запрос 755 строк и занимает около 2500 мс!
3) Если я добавлю больше ограничений для MATCH, подобно тому же полу, тому же alma mater и т. Д., Времена запросов постепенно ухудшаются до> 10 000 мс.
Что я здесь делаю неправильно?
Возможно, 'WHERE (u) - [: hometown] -> (h) <- [: hometown] - (o)' вместо WITH ... MATCH ... также поможет – PhilBa
Я думаю, что проблема в том, что с помощью WITH и MATCH cypher сначала выполняет каждое предложение MATCH отдельно, затем строит декартово произведение и только после этого соединяет U, I, O. Но это скорее догадка, чем что-либо. – PhilBa
Поскольку два шаблона могут быть объединены и выражены как один, не должно быть необходимости для 'WITH' или' WHERE' вообще, или это была моя идея. ОП упоминает дополнительные ограничения, возможно, расширенный набор ограничений не будет отображаться вместе в одном шаблоне. Я не знаю, что было бы лучше тогда, мой смысл заключался бы в том, чтобы помещать ограничения в предложение WHERE, если они являются просто расширениями шаблона и делят запрос на 'WITH', только если операции записи, агрегирования или другие операции вовлечены. Я не знаю внутренности Cypher, поэтому мои 0,02 доллара скромны. Как вы думаете? – jjaderberg