Similar presentations:
Лекция №8 Хранилища данных
1.
Neo4j vs MySQL2.
Сравнение Neo4j и MySQLДля того, чтобы сравнить на эффективность,
надо заполнить базы данных одинаковым
контентом.
Была выбрана предметная область —
социальная сеть. ER диаграмма, на основе
которой создал реляционную и графовую
модели.
3.
4.
Количество данных, которые быливнесены в MySQL а затем в Neo4j:
addUsers(100 000); — количество пользователей.
addGroups(200 000); — количество групп.
addPhotos(300 000); — количество фотографий.
addAudio(250 000); — количество аудиозаписей.
addFriendships(1 000 000); — количество друзей.
addMessages(4 000 000); — количество сообщений.
addUserAudio(350 000); — количество аудиозаписей.
addUserGroups(400 000); — количество групп
пользователей.
addUserPhoto(400 000); — количество фотографий
пользователей.
Объемы базы данных: для реляционной БД надо было
351.5 МБ, а для графовой – 3.45 ГБ.
5.
Эксперимент 16.
7.
РезультатыUser count = 100000
Number of queries
Time for MySQL, ms
Time for Neo4j, ms
10
4
9
100
34
76
1000
286
510
5000
1034
1103
10000
1340
1187
30000
3390
1384
60000
6876
2102
90000
10537
3175
120000
14033
3858
8.
9.
Эксперимент 2Описание эксперимента: измерение времени
нахождения общего количества фотографий у
пользователей, которые администрируют
хотя бы одну группу, в зависимости от
диапазона значений идентификаторов
пользователя.
10.
experiment 1id range <
Time for MySQL, ms Time for Neo4j,ms
10
120
10767
100
690
10706
1000
5879
10884
5000
24668
12245
10000
52462
12280
30000
154534
13352
60000
296369
14545
90000
489830
18058
11.
12.
Постановка задачиВ нашем проекте возникла следующая задача —
есть база с большим количеством товаров, на
уровне сотен тысяч. У каждого товара есть сотни
динамически создаваемых характеристик.
Необходимо обеспечить быструю фильтрацию
по товарам по набору различных характеристик.
Время формирования ответа должно быть не
более 0.3 секунды, нужно поддерживать
сложную логику в стиле.
• (характеристика1 = true AND (характеристика2
< 100)) OR (характеристика1 = false AND
(характеристика3 > 17)) ... далее обычно
мешанина из AND\OR
13.
Терминология задачи по фильтрации товаров (вупрощенном виде)
• характеристика — определенное свойство товара. Например, объем
памяти.
• шаблон товара — набор всех возможных характеристик однотипных
товаров, например — перечень возможных характеристик
компьютерных мышек. При добавлении нового товара администратор
может выбирать характеристики в рамках шаблона. Добавить новую
характеристику для одного товара невозможно — нужно добавить
характеристику в шаблон для этого товара. Одновременно эта
характеристика будет доступна для всех товаров, использующих этот
шаблон
• группа товаров — товары на основе одного шаблона. Например,
компьютерные мышки. Фильтрация делается только для товаров из
одной группы
• критерий — логическое правило, которое состоит из набора
формальных требований к характеристикам товара. Например,
«геймерская мышка» — это набор требований к характеристикам
(размер не миниатюрный) AND (сенсор лазерный) AND (разрешение
сенсора не менее 1500)
• фильтр — группа критериев для однотипных товаров. В зависимости
от критериев, они могут комбинироваться через AND или OR
14.
Схема решения задачиДля каждого товара создать отдельную ноду. Для каждого
критерия создать свою ноду. Дальше, связать все ноды
товаров с нодами критериев, которые подходят для товара.
При изменении характеристик товара или свойств критериев
обновлять связи между нодами.
15.
Первый вариант решения — с Neo4jРазвернуть локально Neo4j, изучить на базовом
уровне Cypher и попробовать реализовать требуемую
логику. Если все получиться — провести тестирование
скорости работы для базы из 1 миллиона товаров, у
каждого 500 характеристик.
Разворачивание системы достаточно простое —
скачиваем дистрибутив и устанавливаем его.
У Neo4j сервера есть RestAPI, для php есть
библиотека neo4jphp. Также есть bundle для
интеграции с Symfony2 — klaussilveira/neo4j-ogmbundle.
В дистрибутив входит веб сервер и приложение для
работы с ним, по умолчанию http://localhost:7474/
16.
В качестве документации удобноиспользовать краткую документацию
https://neo4j.com/docs/2.0/cypher-refcard/
Примеры кода
https://github.com/neo4j-contrib/graphgist/wiki
17.
• Простые Cypher командыСоздание ноды с меткой
create (n:Ware {wareId: 1});
Выбрать все ноды
MATCH (n) RETURN n;
Счетчик
MATCH (n:Ware {wareId:1}) RETURN "Our graph have "+count(*)+"
Nodes with label Ware and wareId=1" as counter;
Создать 2 связанные ноды
CREATE (n{wareId:1})-[r:SUIT]->(m{criteriaId:1})
Связать 2 существующие ноды
MATCH (a {wareId: 1}), (b {criteriaId: 2}) MERGE (a)-[r:SUIT]->(b)
Удалить все связанные ноды
match (n)-[r]-() DELETE n,r;
Удалить все несвязанные ноды — если попробовать запустить
эту команду в базе, где есть связанные ноды — она не пройдет.
Нужно удалить вначале связанные ноды.
match n DELETE n;
Выбрать товары, которым подходит критерий 3
MATCH (a:Ware)-->(b:Criteria {criteriaId: 3}) RETURN a;
18.
Пришло время протестировать скоростьзаполнения базы и простых выборок из
большой базой.
Для этого клонируем neo4jphp:
git clone https://github.com/jadell/neo4jphp.git
Базовое описание этой библиотеки есть
в этом посте:
https://habr.com/ru/post/152079/
19.
С примеров заполнения можнопознакомиться по ссылке:
https://m.habr.com/ru/post/219441/
database