2014-03-21 4 views
0

Я начинаю работу с Neo4J 2.0.1, и я уже сталкиваюсь с проблемами производительности, которые заставляют меня думать, что мой подход неправильный. До сих пор у меня есть один тип узла (все с меткой NeoPerson) и один тип отношений (все с лейблом NeoWeight). В моей тестовой установке насчитывается около 100 000 узлов, и каждый узел имеет от 0 до 300 отношений с другими узлами. Существует индекс Neo4j2.0 в единственном поле NeoPerson, называемом profile_id (например, CREATE INDEX ON: NeoPerson (profile_id)). Глядя вверх NeoPerson по profile_id достаточно быстро:Получение связей для одного узла медленное

neo4j-sh (?)$ match (n:NeoPerson {profile_id:38}) return n; 
+----------------------------+ 
| n       | 
+----------------------------+ 
| Node[23840]{profile_id:38} | 
+----------------------------+ 
1 row 
45 ms 

Однако, когда я бросить отношения в микс, он получает довольно медленно.

neo4j-sh (?)$ match (n:NeoPerson {profile_id:38})-[e:NeoWeight]->() return n, e; 
+----------------------------------------------------------------------------+ 
| n       | e            | 
+----------------------------------------------------------------------------+ 
| Node[23840]{profile_id:38} | :NeoWeight[8178324]{value:384}    | 
| Node[23840]{profile_id:38} | :NeoWeight[8022460]{value:502}    | 
... 
| Node[23840]{profile_id:38} | :NeoWeight[54914]{}       | 
+----------------------------------------------------------------------------+ 
244 rows 
2409 ms 

Насколько я понимаю, что обход отношения с одного узла должно быть достаточно эффективным (не то, что точка с использованием базы данных графа?), Так почему же принимает более 2 секунд для такого простого запроса на небольшой набор данных? Я не видел способа добавить индекс к отношениям, ключи которых являются исходными и/или целевыми узлами.

+0

Был ли это первый запуск запроса или последующий запуск? Первый запуск должен загружать данные с диска. И может быть медленнее. –

+0

Обычно вы видите улучшение 10-20 после первого запуска, если вы не разделяете более подробную информацию о своей базе данных и конфигурации с нами. –

+0

Да, выполнение одного и того же запроса дважды подряд значительно быстрее (585 мс вместо 2409 мс). Но 2,4 секунды для такого простого запроса на небольшом наборе данных, хотя холодно? Я не могу поверить, что люди используют Neo4j в производстве, если это лучшее, что он может сделать. Что мне не хватает? –

ответ

0

Люди используют Neo4j в производстве без проблем. Если у них есть требование, чтобы первый пользовательский запрос возвращался в течение нескольких мс, они нагревают кеши после запуска сервера. Например. запустив их самые важные запросы в случае использования.

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

Для первого запроса он также занимает немного больше времени, поскольку его план запросов должен быть построен и скомпилирован. Вот почему в производстве вы обычно используете параметры, позволяющие кэшировать запрос.

Каков прецедент, к которому вы пытаетесь обратиться?

+0

Узлы представляют людей, и между многими людьми есть связи. Это приложение, и когда люди посещают, их узлы и некоторые их узлы отношений будут восстановлены, поэтому не вполне предсказуемо, какие из них понадобятся раньше времени. Писания (особенно отношения между узлами) являются общими. Я планировал гораздо больший график в производстве. Итак, вы говорите, что если все, что мне нужно получить, будет заблокировано в памяти, я должен ожидать многосекундную производительность запросов для базовых запросов? Конечно, я понимаю, что это будет быстрее, если вы будете кэшировать, но эта задержка ужасна. –

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