Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#7 - Описание нереляционная модели данных для neo4j #7

Open
azazzze1 opened this issue Oct 21, 2024 · 2 comments

Comments

@azazzze1
Copy link
Collaborator

azazzze1 commented Oct 21, 2024

Необходимо расписать модель данных в соответствие со следующими пунктами:

A. Графическое представление модели (ER-диаграмма)
B. Описание назначений коллекций, типов данных и сущностей
C. Оценка объема информации, хранимой в модели (сколько потребуется памяти, чтобы сохранить объекты, как объем зависит от количества объектов - нужно выразить через переменную (количество одного из видов объектов вашей БД)). У вас должна получится формула - зависимость объема от одной переменной.
D. Избыточность модели (отношение между фактическим объемом модели и «чистым» объемом данных).. У вас должна получится формула - зависимость избыточности от одной переменной.
E. Направление роста модели при увеличении количества объектов каждой сущности.
F. Примеры хранения данных в БД для модели (два подраздела «Примеры данных»).
G. «Примеры запросов» - запросы к модели, с помощью которых реализуются сценарии использования
i. Текст запросов
ii. Количество запросов для совершения юзкейсов в зависимости от числа объектов в БД и прочих параметров
iii. Количество задействованных коллекций (если есть)

Готовое задание прикрепить в файле с разметкой markdown (,md) к данному тикету.
Дедлайн: 26 октября 2024

@azazzze1 azazzze1 changed the title #6 - Описание нереляционная модели данных для neo4j #7 - Описание нереляционная модели данных для neo4j Oct 21, 2024
@kaidux22
Copy link
Collaborator

@kaidux22
Copy link
Collaborator

Нереляционная модель

nosql.png

Описание назначений коллекций, типов данных и сущностей

Узлы

Patient - узел с одноимённым классификационным признаком Patient, описывающий аккаунт зарегистрированного пользователя. Имеет следующие атрибуты key-value:

  • fullname: string – ФИО пользователя. Максимальная длина - 100 символов
  • mail: string - Адрес электронной почты пользователя. Максимальная длина - 255 символов
  • password: string - Пароль от данного аккаунта. Максимальная длина - 64 символа
  • sex: bool or NULL- Пол пользователя (Женский/Мужской)
  • age: int or NULL - Полное количество лет пользователю
  • height: int or NULL - Рост пользователя
  • weight: int or NULL - Вес пользователя

Appeal - узел с одноимённым классификационным признаком Appeal, описывающий запрос на составление анамнеза зарегистрированного пользователя. Имеет следующие атрибуты key-value:

  • Date: datetime – Дата и время отправления запроса

Symptom - узел с одноимённым классификационным признаком Symptom, хранящий информацию об определённом симптоме. Имеет следующие атрибуты key-value:

  • name: string – Наименование симптома. Максимальная длина - 50 символов
  • description: string - Описание симптома. Максимальная длина - 500 символов

Disease - узел с одноимённым классификационным признаком Disease, хранящий информацию об определённом заболевании. Имеет следующие атрибуты key-value:

  • name: string – Наименование заболевания. Максимальная длина - 50 символов
  • description: string - Описание заболевания. Максимальная длина - 500 символов
  • recommendations: string - Рекомендации по лечению и профилактике. Максимальная длина - 500 символов

Analysis - узел с одноимённым классификационным признаком Analysis, хранящий информацию об определённом анализе. Имеет следующие атрибуты key-value:

  • name: string – Наименование анализа. Максимальная длина - 50 символов

Связи

Create - связь с одноимённым классификационным признаком Create, описывающая принадлежность узла Appeal к узлу Patient. Позволяет получить по определённому пользовательскому аккаунту сделанные с него обращения.

Belong - связь с одноимённым классификационным признаком Belong, описывающая принадлежность узла Patient к узлу Appeal. Позволяет получить по определённому обращению пользовательский аккаунт, с которого оно было сделано.

Contain - связь с одноимённым классификационным признаком Contain, описывающая принадлежность узла Symptom к узлу Appeal. Позволяет определять симптомы, введённые в конкретном обращении.

Confirm - связь с одноимённым классификационным признаком Confirm, описывающая принадлежность узла Analysis к узлу Symptom. Позволяет определять анализы, которые помогли бы выявить конкретный симптом.

Predict - связь с одноимённым классификационным признаком Predict, описывающая принадлежность узла Appeal к узлу Disease. Позволяет получить и обработать симптомы, введённые в данные обращении и симптомы, характеризующие болезнь, для последующей подборки рекомендуемых анализов.

Describe - связь с одноимённым классификационным признаком Describe, описывающая принадлежность узла Disease к узлу Symptom. Содержит атрибут weight, указывающий на корреляцию между данными симптомом и болезнью. Позволяет определять заболевания, характеризующиеся данным симптомом.

Cause - связь с одноимённым классификационным признаком Cause, описывающим принадлежность узла Symptom к узлу Disease. Содержит атрибут weight, указывающий на корреляцию между данными симптомом и болезнью. Позволяет определять симптомы, набор которых характеризует данное заболевание.

Оценка объема информации, хранимой в модели

Предположим, что

  • пользователь будет создавать в среднем 7 обращений
  • каждый симптом будет иметь в среднем один анализ для своего подтверждения
  • каждая болезнь будет иметь в среднем по 5 симптомов
  • в каждом обращении будет в среднем по 5 симптомов
  • каждое обращение будет прогнозировать с среднем 10 болезней

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

Общий объём каждого узла

Patient:

  • fullname: 100 символов по 2 байта = 200 байт
  • mail: 255 символов по 2 байта = 510 байт
  • password: 64 символа по 2 байта = 128 байт
  • sex: 1 байт
  • age: 4 байта
  • height: 4 байта
  • weight: 4 байта

::Итого: 851 байт::

Appeal:

  • Date: 8 байт

::Итого: 8 байт::

Symptom:

  • name: 50 символов по 2 байта = 100 байт
  • description: 500 символов по 2 байта = 1000 байт

::Итого: 1100 байт::

Disease:

  • name: 50 символов по 2 байта = 100 байт
  • description: 500 символов по 2 байта = 1000 байт
  • recommendations: 500 символов по 2 байта = 1000 байт

::Итого: 2100 байт::

Analysis:

  • name: 50 символов по 2 байта = 100 байт

::Итого: 100 байт::

Связи

Describe:

  • weight: 4 байта

::Итого: 4 байта::

Cause:

  • weight: 4 байта

::Итого: 40 байта::

Таблица 1 - расчёт "чистого" объёма данных (в байтах)

Label Количество Размер (в байтах)
Patient N 851 * N
Appeal 7 * N 56 * N
Symptom 133 146300
Disease 41 86100
Analysis 133 13300
Describe 4 820
Cause 4 820

Таким образом, получаем следующую функцию от количество пользователей N:

$$ v_{clean}(N) = (851 + 56) * N + 146300 + 86100 + 13300 + 820 + 820 = 907 * N + 247340 $$

Избыточность модели

Теперь учитываем, что бд Neo4j пользуется такими элементами, как узел и связь, а также позволяет накладывать такие метаданные, как классификационные метки. С учётом этого посчитаем фактический размер получающейся базы данных.

Patient:

  • Узел: 15 байт
  • Метка Patient : 7 символов по 1 байту = 7 байт
  • fullname: 100 символов по 2 байта = 200 байт
  • mail: 255 символов по 2 байта = 510 байт
  • password: 64 символа по 2 байта = 128 байт
  • sex: 1 байт
  • age: 4 байта
  • height: 4 байта
  • weight: 4 байта

::Итого: 873 байт::

Appeal:

  • Узел: 15 байт
  • Метка Appeal : 6 символов по 1 байту = 6 байт
  • Date: 8 байт

::Итого: 29 байт::

Symptom:

  • Узел: 15 байт
  • Метка Symptom : 7 символов по 1 байту = 7 байт
  • name: 50 символов по 2 байта = 100 байт
  • description: 500 символов по 2 байта = 1000 байт

::Итого: 1122 байт::

Disease:

  • Узел: 15 байт
  • Метка Disease: 7 символов по 1 байту = 7 байт
  • name: 50 символов по 2 байта = 100 байт
  • description: 500 символов по 2 байта = 1000 байт
  • recommendations: 500 символов по 2 байта = 1000 байт

::Итого: 2122 байт::

Analysis:

  • Узел: 15 байт
  • Метка Analysis: 8 символов по 1 байту = 8 байт
  • name: 50 символов по 2 байта = 100 байт

::Итого: 123 байт::

Связи

Create:

  • Связь: 31 байт
  • Метка Create: 6 символов по 1 байту = 6 байт

::Итого: 37 байт::

Belong:

  • Связь: 31 байт
  • Метка Belong: 6 символов по 1 байту = 6 байт

::Итого: 37 байт::

Contain:

  • Связь: 31 байт
  • Метка Contain: 7 символов по 1 байту = 7 байт

::Итого: 38 байт::

Confirm:

  • Связь: 31 байт
  • Метка Confirm: 7 символов по 1 байту = 7 байт

::Итого: 38 байт::

Predict:

  • Связь: 31 байт
  • Метка Predict: 7 символов по 1 байту = 7 байт

::Итого: 38 байт::

Describe:

  • Связь: 31 байт
  • Метка Describe: 8 символов по 1 байту = 8 байт
  • weight: 4 байта

::Итого: 43 байт::

Cause:

  • Связь: 31 байт
  • Метка Cause: 5 символов по 1 байту = 5 байт
  • weight: 4 байта

::Итого: 40 байт::

Таблица 1 - размер всех коллекций (в байтах)

Label Количество Размер (в байтах)
Patient N 873 * N
Appeal 7 * N 203 * N
Symptom 133 149226
Disease 41 87002
Analysis 133 16359
Create 7 * N 259 * N
Belong 7 * N 259 * N
Contain 35 * N 1330 * N
Confirm 133 5054
Predict 70 * N 2660 * N
Describe 205 8815
Cause 205 8200

Получаем следующую функцию от количество пользователей N:

$$ v_{common}(N) = (873 + 203 + 259 + 259 + 1330 + 2660) * N + 149226 + 87002 + 16359 + 5054 + 8815 + 8200 = 5584 * N + 274656 $$

Таким образом, коэффициент избыточности модели будет равен

$$ \frac{v_{common}}{v_{clean}} = \frac{5584 * N + 274656}{907 * N + 247340} $$

Image.png

Направление роста модели при увеличении количества объектов каждой сущности

Увеличение количества узлов типа Patient приводит к линейному росту, равному собственному размеру данной сущности. Таким образом, рост составит f(n) = 873n байт.

Увеличение количества узлов типа Appeal приводит к появлению связей следующий типов: Create, Belong, Contain и Predict. В худшем случае, пользователь введёт все симптомы, которые будут характеризовать все заболевания. Таким образом, рост составит f(n) = (29 + 2 * 37 + 133 + 41) * n = 277 байт.

Увеличение количества узлов типа Symptom может привести к росту взвешенных связей типов Describe и Cause, а также к росту связей с определёнными анализами. В худшем случае, будем считать, что симптом свяжется со всеми анализами и заболеваниями. Таким образом, рост составит f(n) = (1122 + 41 * (43 + 40) + 133 * 38) * n = 9579 байт.

Увеличение количества узлов типа Disease может привести к росту взвешенных связей типов Describe и Cause. В худшем случае, будем считать, что заболевание свяжется со всеми симптомами. Таким образом, рост составит f(n) = (2122 + 133 * (43 + 40)) * n = 13161 байт.

Увеличение количества узлов типа Analysis может привести к росту связей типа Confirm. В худшем случае, анализ будет позволять определять любой симптом. Таким образом, рост составит f(n) = (123 + 133 * 38) = 5177.

Примеры хранения данных в БД для модели

Пользователь и его обращение

image.png

╒══════════════════════════════════════════════════════════════════════╤══════════════════════════════════════════════════════════════════════╤═════════╕
│n                                                                     │m                                                                     │r        
╞══════════════════════════════════════════════════════════════════════╪══════════════════════════════════════════════════════════════════════╪═════════╡
(:Patient {password: "securepassword123",sex: true,weight: 75,fullname│(:Appeal {Date: "30.10.2024"})                                        [:CREATE]
: "Иванов Иван Иванович",email: "iiivanov@etu.ru",age: 30,height: 180}                                                                               
)                                                                                                                                                    
├──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼─────────┤
(:Appeal {Date: "30.10.2024"})                                        (:Patient {password: "securepassword123",sex: true,weight: 75,fullname│[:BELONG]
                                                                      : "Иванов Иван Иванович",email: "iiivanov@etu.ru",age: 30,height: 180}         
                                                                      )                                                                              
└──────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┴─────────┘

Болезнь и её симптомы

image.png

╒════════════════════════╤═══════════╤═══════════╕
│r1                      │n1.name    │n2.name    
╞════════════════════════╪═══════════╪═══════════╡
[:DESCRIBE {weight: 10}]"Лихорадка""Простуда" 
├────────────────────────┼───────────┼───────────┤
[:CAUSE {weight: 10}]   "Простуда" "Лихорадка"
├────────────────────────┼───────────┼───────────┤
[:DESCRIBE {weight: 10}]"Озноб"    "Простуда" 
├────────────────────────┼───────────┼───────────┤
[:CAUSE {weight: 10}]   "Простуда" "Озноб"    
├────────────────────────┼───────────┼───────────┤
[:DESCRIBE {weight: 10}]"Кашель"   "Простуда" 
├────────────────────────┼───────────┼───────────┤
[:CAUSE {weight: 10}]   "Простуда" "Кашель"   
└────────────────────────┴───────────┴───────────┘

Экземпляр болезни

{
  "identity": 2,
  "labels": [
    "Disease"
  ],
  "properties": {
    "name": "Простуда",
    "description": "Клинический синдром острого воспаления верхних дыхательных путей, затрагивающего преимущественно нос и возникающего из-за неспецифической острой респираторной инфекции. В воспаление могут быть вовлечены горло, гортань и пазухи. Обычно термин применяется в отношении симптомов, связанных с воспалением, и используется наряду с фарингитом, ларингитом, трахеитом и другими, употребляется в отношении острой респираторной вирусной инфекции верхних дыхательных путей и является традиционным для обозначения лёгких случаев заболевания верхних дыхательных путей. Термин широко используется в англоязычной литературе, в русскоязычной вместо него обычно используется более общий термин острой респираторной вирусной инфекции."
  },
  "elementId": "4:108d56d7-54c8-4bb9-ac55-3588861a3984:2"
}

Экземпляр пациента

{
  "identity": 3,
  "labels": [
    "Patient"
  ],
  "properties": {
    "password": "securepassword123",
    "sex": true,
    "weight": 75,
    "fullname": "Иванов Иван Иванович",
    "email": "iiivanov@etu.ru",
    "age": 30,
    "height": 180
  },
  "elementId": "4:108d56d7-54c8-4bb9-ac55-3588861a3984:3"
}

Примеры запросов

Регистрация пользователя

Merge (:Patient {fullname: "Иванов Иван Иванович", email: "iiivanov@etu.ru", password: "securepassword123", sex: True, age: 30, height: 180, weight: 75})

Количество запросов для совершения UseCase: 1

Количество задействованных коллекций: 1

Создание обращения

match (p: Patient {fullname: "Иванов Иван Иванович"})
match (s1:Symptom {name: "Озноб"})-[:DESCRIBE]->(d1)
match (s2:Symptom {name: "Лихорадка"})-[:DESCRIBE]->(d2)
match (s3:Symptom {name: "Кашель"})-[:DESCRIBE]->(d3)
merge (p)-[:CREATE]->(a: Appeal {date: "24.05.2023 15:31:16"})-[:BELONG]->(p)
merge (d1)-[:PREDICT]->(a)-[:CONTAIN]->(s1)
merge (d2)-[:PREDICT]->(a)-[:CONTAIN]->(s2)
merge (d3)-[:PREDICT]->(a)-[:CONTAIN]->(s3)

Количество запросов для совершения UseCase: 1

Количество задействованных коллекций: 4

Получение статистики распространённости симптома среди пациентов

match (a:Appeal)-[:BELONG]->(p: Patient)
where "20.05.2023" < a.date and a.date < "27.05.2023" and p.sex = True
RETURN a

Количество запросов для совершения UseCase: 1

Количество задействованных коллекций: 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants