Хобрук: Ваш путь к мастерству в программировании

Производительность запросов Neo4J

У меня относительно небольшой график (2,5 млн узлов, 5 млн отн., 7,7 млн ​​свойств), и я выполняю (как мне кажется) простой запрос, но на быстром ноутбуке с SSD он выполняется 63 секунды. Это действительно та производительность, которую я должен ожидать от Neo4j, или что-то не так с запросом?

start ph=node(2)
match ph-[:NEXT_LEVEL]->c
where c.tag = "class 1"
with c
match c-[:NEXT_LEVEL]->p<-[:SOLD]-l<-[:LINE]-h-[:SOLD_IN]->s
return s.tag as store, sum(l.item_quantity) as quantity order by s.tag;

консольный вывод

Обновление: Просто хотел опубликовать обновленный запрос:

start ph=node(2)
match ph-[:NEXT_LEVEL]->c-[:NEXT_LEVEL]->p<-[:SOLD]-l<-[:LINE]-h-[:SOLD_IN]->s
where c.tag = "class 1"
with s.tag as store, sum(l.item_quantity) as quantity
return store, quantity order by store;

консоль с обновленным запросом

10.06.2013

  • Это не так мало для работы на вашем локальном компьютере, и, пожалуйста, уточните, что вы подразумеваете под быстротой, потому что не имеет значения, есть ли у вас жесткий диск SSD, если у вас есть 512 мегабайт DRAM. 10.06.2013
  • 6 ГБ ОЗУ, но, возможно, я недооцениваю размер графа. Я проведу тест на сервере с лучшими характеристиками и сообщу о результатах. 10.06.2013
  • Это Одд. Итак, я запускаю это на сервере 2 Xeon с 24 ГБ ОЗУ и дисками 15 КБ в Raid 5, и запрос возвращает МЕДЛЕННЕЕ, чем на моем ноутбуке (52 секунды против 2,3). Рекомендуемые характеристики, основанные на расчете Neo4j: 4 ядра и 7 ГБ ОЗУ. Я что-то упустил? 10.06.2013
  • @Gil Вероятно, вам следует задать новый вопрос о том, почему производительность ваших запросов на двух машинах различается. Этот вопрос выходит за рамки этого. 10.06.2013

Ответы:


1

Если у вас нет конкретного варианта использования, вам обычно следует попробовать удалить предложение WITH для повышения производительности.

start ph=node(2)
match ph-[:NEXT_LEVEL]->c-[:NEXT_LEVEL]->p<-[:SOLD]-l<-[:LINE]-h-[:SOLD_IN]->s
where c.tag = "class 1"
return s.tag as store, sum(l.item_quantity) as quantity order by s.tag;

Редактировать. Как обсуждалось в комментариях, мы можем добиться еще большей производительности, заставив ORDER BY выполняться после агрегации, а не до нее. Мы можем сделать это, используя WITH (так что есть тот конкретный вариант использования, о котором мы только что говорили). Разница здесь в том, что мы переместили предложение WITH как можно дальше в конец, что позволяет сгруппировать всю предыдущую обработку, а не разделять ее.

start ph=node(2)
match ph-[:NEXT_LEVEL]->c-[:NEXT_LEVEL]->p<-[:SOLD]-l<-[:LINE]-h-[:SOLD_IN]->s
where c.tag = "class 1"
with s.tag as store, sum(l.item_quantity) as quantity
return store, quantity order by store;
10.06.2013
  • Спасибо. Уменьшил его до 37 секунд, что лучше, но все равно много. 10.06.2013
  • @ Гил Согласен, все еще очень высоко. Из любопытства, можете ли вы попробовать удалить ORDER BY, просто чтобы посмотреть, сильно ли это повлияет на производительность? Кроме того, сколько строк будет возвращено, если вы удалите sum(), так что ваше предложение возврата будет просто return s.tag as store, l.item_quantity? 10.06.2013
  • хорошо, без Order By это до 3 секунд! Количество строк, возвращаемых после удаления sum(), равно 107 153. Есть ли лучший способ сделать заказ? 10.06.2013
  • Вы можете попытаться найти c как индексированный узел: start c=node:tags(tag=class 1) match c-[:NEXT_LEVEL]-›... 10.06.2013
  • вы можете попробовать сделать: WITH s.tag as store, sum(l.item_quantity) as quantity RETURN store, quantity order by store 10.06.2013
  • @Gil Я думаю, что Майкл прав. Вопреки тому, что я только что сказал об удалении WITH везде, где это возможно, я думаю, что в этом случае это могло бы вам помочь. Я думаю, что происходит, так это то, что neo4j упорядочивает результаты перед агрегированием (что означает, что он упорядочивает 107 тыс. строк). Если вы используете WITH, а затем упорядочиваете что-то в WITH, как предложил Майкл, он должен сначала выполнить агрегацию перед порядком. 10.06.2013
  • @MichaelHunger: с индексом он возвращается через 7 секунд. 10.06.2013
  • @ean5533: хорошо, намного лучше. Следующий запрос возвратил через 2,3 секунды start ph=node(2) match ph-[:NEXT_LEVEL]-›c-[:NEXT_LEVEL]-›p‹-[:SOLD]-l‹-[:LINE]-h-[ :SOLD_IN]-›s, где c.tag = класс 1 с s.tag в качестве магазина, sum(l.item_quantity) в качестве количества возвращаемого магазина, количество в порядке магазина; Я все еще беспокоюсь, как это будет масштабироваться. Мой окончательный граф будет иметь более 600 миллионов узлов... 10.06.2013
  • Если вы помните, обновите этот вопрос, когда ваш график приблизится к окончательному размеру, или сделайте сообщение в блоге. Это больший график, чем я построил, и я хотел бы узнать историю. 12.06.2013
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..