Skip to content

Графовые базы данных ​

Графовые базы данных — это тип NoSQL баз данных, которые используют графовую модель для хранения и управления данными. В отличие от реляционных баз данных, которые организуют данные в таблицах, графовые базы данных представляют данные в виде узлов (вершин) и рёбер (связей) между ними. Это позволяет эффективно моделировать и анализировать сложные взаимосвязи между данными.

Основные характеристики графовых баз данных ​

Структура узлов и рёбер ​

  • Узлы (Nodes): Представляют сущности в графе, такие как пользователи, продукты или места.
  • Рёбра (Edges): Представляют отношения между узлами. Рёбра могут иметь направление (ориентированные) или быть без направления (неориентированные) и могут содержать свойства.

Гибкость схемы ​

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

Эффективные запросы ​

Графовые базы данных оптимизированы для выполнения сложных запросов, связанных с отношениями, таких как поиск ближайших соседей, маршрутизация и анализ социальных сетей.

Поддержка свойств ​

Узлы и рёбра могут иметь свойства, которые представляют дополнительные данные о них. Например, узел пользователя может иметь свойства, такие как имя и возраст, а ребро «дружбы» может иметь свойство «с момента».

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

Пример кода ​

Давайте посмотрим, на примере Neo4j, как будет выглядеть код на создание небольшой структуры данных. Для этого будет использоваться язык Cypher:

cypher
// Создание узлов
CREATE (s1:Student {student_id: 1, first_name: 'Иван', last_name: 'Иванов', date_of_birth: '2000-01-01', enrollment_date: '2018-09-01'})
CREATE (s2:Student {student_id: 2, first_name: 'Мария', last_name: 'Петрова', date_of_birth: '1999-05-15', enrollment_date: '2019-09-01'})

CREATE (c1:Course {course_id: 1, course_name: 'Введение в программирование', credits: 3, department: 'Информатика'})
CREATE (c2:Course {course_id: 2, course_name: 'Алгоритмы и структуры данных', credits: 4, department: 'Информатика'})

CREATE (p1:Professor {professor_id: 1, first_name: 'Алексей', last_name: 'Петров', department: 'Информатика'})
CREATE (p2:Professor {professor_id: 2, first_name: 'Светлана', last_name: 'Сидорова', department: 'Математика'})

// Создание ребер
MATCH (s1:Student {student_id: 1}), (c1:Course {course_id: 1})
CREATE (s1)-[:ENROLLED_IN {enrollment_date: '2018-09-01'}]->(c1)

MATCH (s2:Student {student_id: 2}), (c1:Course {course_id: 1})
CREATE (s2)-[:ENROLLED_IN {enrollment_date: '2019-09-01'}]->(c1)

MATCH (s1:Student {student_id: 1}), (c2:Course {course_id: 2})
CREATE (s1)-[:ENROLLED_IN {enrollment_date: '2019-09-01'}]->(c2)

MATCH (p1:Professor {professor_id: 1}), (c1:Course {course_id: 1})
CREATE (p1)-[:TEACHES {start_date: '2015-08-15'}]->(c1)

MATCH (p2:Professor {professor_id: 2}), (c2:Course {course_id: 2})
CREATE (p2)-[:TEACHES {start_date: '2020-01-10'}]->(c2)

CREATE (g1:Grade {grade_id: 1, value: 4.5, date_assigned: '2021-12-01'})
MATCH (s1:Student {student_id: 1}), (g1:Grade {grade_id: 1})
CREATE (s1)-[:RECEIVED]->(g1)

CREATE (g2:Grade {grade_id: 2, value: 3.0, date_assigned: '2021-12-01'})
MATCH (s2:Student {student_id: 2}), (g2:Grade {grade_id: 2})
CREATE (s2)-[:RECEIVED]->(g2)