Гра́фовая база данных
Гра́фовая база данных — разновидность баз данных с реализацией сетевой модели в виде графа и его обобщений.
Графовая СУБД — система управления графовыми базами данных.
Модель хранения информации в виде графов, графов со свойствами в узлах и гиперграфов сложилась в 1990—2000 годах[1], хотя использование графов в виде модели представления данных сложилось ещё с 1980-х годов[1]. Первая графовая СУБД Neo4j создана в 2007 году. По состоянию на начало 2020-х годов существуют десятки других графовых СУБД.
Графовую модель данных обычно рассматривают как обобщение RDF-модели или сетевой модели данных[1]. Основными элементами модели являются узлы и связи. В зависимости от реализации узлов и рёбер графовую модель данных разделяют на несколько подтипов.
В графовых СУБД, как правило, разделяют подсистему хранения (англ. underlying storage) и механизм обработки (англ. processing engine)[2].
Для аналитической работы с большими объёмами данных в глобальных графах применяются специализированные механизмы графовых вычислений (англ. graph compute engine). В отличие от графовых СУБД, ориентированных в основном на OLTP-приложения, в системах графовых вычислений используются подходы и методы оптимизации, свойственные OLAP. Существуют различные реализации механизмов для графовых вычислений, как резидентные (англ. in-memory), так и использующие энергонезависимые устройства хранения, как работающие на одном узле, так и распределённые (работающие на нескольких узлах одновременно)[2].
Графовые базы данных применяются для моделирования социальных графов (социальных сетей)[3], в биоинформатике, а также для семантической паутины[4]. Для задач с естественной графовой структурой данных графовые СУБД могут существенно превосходить реляционные по производительности, а также иметь преимущества в наглядности представления и простоте внесения изменений в схему базы данных[5].
Источник: Графовая база данных
Neo4j — это графовая система управления базами данных с открытым исходным кодом, реализованная на Java. Она является ведущей графовой СУБД в мире. Аналогами Neo4j являются Oracle NoSQL Database, HypherGraphDB, GraphBase, InfiniteGraph и AllegroGraph.
Источники
1. Википедия
2. habr.com
3. Книги
- Марк Нидхем, Эми Ходлер Графовые алгоритмы. Практическая реализация на платформах Apache Spark и Neo4j. / пер. с англ. В. С. Яценкова – М.: ДМК Пресс, 2020. – 258 с.: ил. ISBN 978-5-97060-799-2
- Рафгарден Тим Р26 Совершенный алгоритм. Графовые алгоритмы и структуры данных. — СПб.: Питер, 2019. — 256 с.: ил. — (Серия «Библиотека программиста»). ISBN 978-5-4461-1272-2 Algorithms Illuminated Tim Roughgarden Part 2: Graph Algorithms and Data Structures
4. Сообщества Neo4j
Создание стенда для изучения Neo4j
Окружение:
- ОС Microsoft Windows 11 22H2 (сборка ОС 22621.2361) + Windows Subsystem for Linux + Ubuntu 22.04 LTS
- Docker Desktop 4.24.1 (123237)
В окне Терминала, под администратором
setx NEO_DATA "C:\Neo4j\neo4jDatabases" /M
В окне Git Bash
$docker system prune
$docker pull neo4j:enterprise
$printenv | grep NEO
$cd $NEO_DATA
$mkdir docker-container1 && cd docker-container1 && mkdir import && mkdir data
$CONTAINER=$(docker run -d --name neo4j -p 7474:7474 -p 7867:7867 -v $NEO_DATA/docker-container1/data:/data -v $NEO_DATA/docker-container1/import:/var/lib/neo4j/import --env=NEO4J_ACCEPT_LICENSE_AGREEMENT=eval neo4j)
$echo "Running Neo4j as $CONTAINER, waiting for startup"
$docker ps
Консоль Neo4j http://localhost:7474
Логин по умолчанию neo4j, пароль neo4j
Установка Neo4j на Ubuntu 22.04.3 LTS
Вариант 1. Установка в виде компонент ОС Ubuntu
wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - echo 'deb https://debian.neo4j.com stable latest' | sudo tee /etc/apt/sources.list.d/neo4j.list sudo apt-get update
liv@singularity:~$ sudo apt list -a neo4j
Listing... Done
neo4j/stable,now 1:5.13.0 all [installed]
neo4j/stable 1:5.12.0 all
neo4j/stable 1:5.11.0 all
neo4j/stable 1:5.10.0 all
neo4j/stable 1:5.9.0 all
neo4j/stable 1:5.8.0 all
neo4j/stable 1:5.7.0 all
neo4j/stable 1:5.6.0 all
neo4j/stable 1:5.5.0 all
neo4j/stable 1:5.4.0 all
neo4j/stable 1:5.3.0 all
neo4j/stable 1:5.2.0 all
neo4j/stable 1:5.1.0 all
liv@singularity:~$ sudo neo4j-admin server report
liv@singularity:~$ sudo systemctl status neo4j.service
liv@igor2024:~$ sudo systemctl status neo4j.service
● neo4j.service - Neo4j Graph Database
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-01-24 21:35:35 +07; 8h ago
Main PID: 6784 (java)
Tasks: 86 (limit: 4483)
Memory: 614.3M
CPU: 10min 38.680s
CGroup: /system.slice/neo4j.service
├─6784 /usr/bin/java -Xmx128m -classpath "/usr/share/neo4j/lib/*:/usr/share/neo4j/etc:/usr/share/neo4j/repo/*" -Dapp.name=neo4j -Dapp.pid=6784 -Dapp.repo=/usr/share/neo4j/repo -Dapp.home=/usr/sha>
└─6814 /usr/lib/jvm/java-21-openjdk-amd64/bin/java -cp "/var/lib/neo4j/plugins/*:/etc/neo4j/*:/usr/share/neo4j/lib/neo4j-cypher-planner-5.16.0.jar:/usr/share/neo4j/lib/neo4j-slf4j-provider-5.16.0>
янв 24 21:35:43 igor2024 neo4j[6814]: 2024-01-24 14:35:43.975+0000 INFO ======== Neo4j 5.16.0 ========
янв 24 21:35:47 igor2024 neo4j[6814]: 2024-01-24 14:35:47.841+0000 INFO Bolt enabled on 0.0.0.0:7687.
янв 24 21:35:49 igor2024 neo4j[6814]: 2024-01-24 14:35:49.222+0000 INFO HTTP enabled on 0.0.0.0:7474.
янв 24 21:35:49 igor2024 neo4j[6814]: 2024-01-24 14:35:49.223+0000 INFO Remote interface available at http://localhost:7474/
янв 24 21:35:49 igor2024 neo4j[6814]: 2024-01-24 14:35:49.229+0000 INFO id: D004B4A9E6E6C112506DB506298CD484E929CB7A859E6B5DF82223B116F15179
янв 24 21:35:49 igor2024 neo4j[6814]: 2024-01-24 14:35:49.230+0000 INFO name: system
янв 24 21:35:49 igor2024 neo4j[6814]: 2024-01-24 14:35:49.231+0000 INFO creationDate: 2024-01-24T14:35:03.125Z
янв 24 21:35:49 igor2024 neo4j[6814]: 2024-01-24 14:35:49.232+0000 INFO Started.
liv@igor2024:~$ sudo neo4j-admin server report
Finding running instance of neo4j
Attached to running process with process id 6814
Connected to JMX endpoint
Writing report to /tmp/reports/igor2024-2024-01-25_062731.zip
1/11 [####################] 100% logs/http.log
2/11 [####################] 100% logs/debug.log
3/11 [####################] 100% logs/neo4j.log
4/11 [####################] 100% plugins.txt
5/11 [####################] 100% system/tree.txt
6/11 [####################] 100% neo4j/tree.txt
7/11 [####################] 100% version.txt
8/11 [####################] 100% vm.prop
9/11 [####################] 100% ps.csv
10/11 [####################] 100% threaddump.txt
11/11 [####################] 100% config/neo4j.conf
Вариант 2. Установка в виде контейнера Docker
liv@singularity:~$ docker volume create portainer_data
portainer_data
liv@singularity:~$ docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
liv@singularity:~$docker pull neo4j
liv@singularity:~$ docker run -d --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/data:/data neo4j
1b8b1567541e01b2abd3ad8dcb440625c01bb5a262ceb61d5bc1c08e4af1616e
Обсуждения на community
Создание ssh-туннеля с машины разработки до сервера
pskill64.exe ssh.exe
start ssh -fNL 7687:localhost:7687 -v -i "D:\Yandex\igor.lytkin.2020\YandexDisk\Singularity\Keys\2023\rsa\ssh_host_rsa_key"
start ssh -fNL 7687:localhost:7687 -v -i "D:\Yandex\igor.lytkin.2020\YandexDisk\Igor2024\id_rsa"
Статьи
- Experimental Evaluation of Graph Databases: JanusGraph, Nebula Graph, Neo4j, and TigerGraph опубликована 7.05.2023
- Введение в язык запросов Cypher 30.12.2019
- Основы работы с Neo4j в браузере 8.10.2019
- Capabilities of the Neo4j Graph Database with Real-life Examples 5.06.2018
Использование Python для работы с Neo4j
pip install neo4j
from neo4j import GraphDatabase
class HelloWorldExample:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
def print_greeting(self, message):
with self.driver.session() as session:
greeting = session.execute_write(self._create_and_return_greeting, message)
print(greeting)
@staticmethod
def _create_and_return_greeting(tx, message):
result = tx.run("CREATE (a:Greeting) "
"SET a.message = $message "
"RETURN a.message + ', from node ' + id(a)", message=message)
return result.single()[0]
if __name__ == "__main__":
greeter = HelloWorldExample("bolt://localhost:7687", "neo4j", "password")
greeter.print_greeting("hello, world")
greeter.close()
Репозитории на GitHub
- Wireshark2Neo4j - анализ трафика из файла Wireshark в Neo4j
Основы графовых баз данных
Property graph model conceptsBasic concepts to get you going |
Концепции графовой модели свойств |
A graph database can store any kind of data using a few basic concepts:
|
Графическая база данных может хранить любые данные, используя несколько основных концепций: |
NodesNeo4j stores data in a graph as nodes The simplest graph has just a single node with some named values called properties. For example, let's draw a social graph:
Key info:
|
Узлы Простейший граф имеет только один узел с некоторыми именованными значениями, называемыми свойствами. Например, давайте нарисуем социальный график: 1. Нарисуйте круг для узла. 2. Добавьте имя Эмиль. 3. Обратите внимание, что он из Швеции. Ключевая информация: • Узлы часто представляют сущности или дискретные объекты, которые могут быть классифицированы с нулем или более меток. • Данные хранятся в виде свойств узлов. • Свойства представляют собой простые пары ключ-значение. |
LabelsAssociate a set of nodes Nodes can be grouped together by applying a Label to each member. In this social graph, you label each node that represents a Person.
|
Метки Узлы можно сгруппировать вместе, применив метку к каждому элементу. На этом социальном графе вы помечаете каждый узел, представляющий человека.
|
More NodesNeo4j is schema-free Like any database, storing data in Neo4j can be as simple as adding more nodes. Nodes can have a mix of common and unique properties. Add a few more nodes and properties:
Key info:
|
Больше узлов
Ключевая информация:
|
RelationshipsConnect the nodes The real power of Neo4j is in connected data. To associate any two nodes, add a relationship that describes how the records are related. In our social graph, you can simply say who knows (relationship type KNOWS) whom:
Key info:
|
Отношения
Ключевая информация:
|
Relationship propertiesStore information shared by two nodes In a property graph, relationships can also contain properties that describe the relationship. Looking more closely at Emil's relationships, note that:
Key info:
|
Свойства взаимосвязи В графе свойств взаимосвязи также могут содержать свойства, описывающие взаимосвязь. Рассматривая более внимательно отношения Эмили, обратите внимание, что: • Эмиль знаком с Йоханом с 2001 года. • Эмиль оценивает Яна на 5 (из 5). • У всех остальных могут быть похожие свойства отношений. Ключевая информация: • Отношения всегда имеют определенное направление. • Отношения всегда имеют определенный тип. • Взаимосвязи формируют шаблоны данных, структуру графика. |