2013-09-30 5 views
1

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

У меня есть база данных графа с 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 мс.

Что я здесь делаю неправильно?

ответ

2

Не могли бы вы попытаться указать шаблон в целом в своем первом MATCH, т. Е. MATCH (u)-[:interests]->(i)<-[:interests]-(o)-[:hometown]->(h)<-[:hometown]-(o)?

+0

Возможно, 'WHERE (u) - [: hometown] -> (h) <- [: hometown] - (o)' вместо WITH ... MATCH ... также поможет – PhilBa

+0

Я думаю, что проблема в том, что с помощью WITH и MATCH cypher сначала выполняет каждое предложение MATCH отдельно, затем строит декартово произведение и только после этого соединяет U, I, O. Но это скорее догадка, чем что-либо. – PhilBa

+0

Поскольку два шаблона могут быть объединены и выражены как один, не должно быть необходимости для 'WITH' или' WHERE' вообще, или это была моя идея. ОП упоминает дополнительные ограничения, возможно, расширенный набор ограничений не будет отображаться вместе в одном шаблоне. Я не знаю, что было бы лучше тогда, мой смысл заключался бы в том, чтобы помещать ограничения в предложение WHERE, если они являются просто расширениями шаблона и делят запрос на 'WITH', только если операции записи, агрегирования или другие операции вовлечены. Я не знаю внутренности Cypher, поэтому мои 0,02 доллара скромны. Как вы думаете? – jjaderberg

Смежные вопросы