Похожие элементы

Гра́фовая база данных

Гра́фовая база данных — разновидность баз данных с реализацией сетевой модели в виде графа и его обобщений. 

Графовая СУБД — система управления графовыми базами данных.

Модель хранения информации в виде графов, графов со свойствами в узлах и гиперграфов сложилась в 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

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" Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
start ssh -fNL 7687:localhost:7687 -v -i "D:\Yandex\igor.lytkin.2020\YandexDisk\Igor2024\id_rsa" Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

Статьи

Использование 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 concepts

Basic concepts to get you going

Концепции графовой модели свойств
Основные понятия, которые помогут вам двигаться дальше

A graph database can store any kind of data using a few basic concepts:

  • Nodes - represent entities of a domain.

  • Labels - shape the domain by grouping nodes into sets.

  • Relationships - connect two nodes.

  • Properties - named values that add qualities to nodes and relationships.

Графическая база данных может хранить любые данные, используя несколько основных концепций:
• Узлы - представляют объекты домена.
• Метки - формируют домен путем группировки узлов в наборы.
• Взаимосвязи - соединяют два узла.
• Свойства - именованные значения, которые добавляют качества узлам и связям.

Nodes

Neo4j 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:

  1. Draw a circle for a node.

  2. Add the name Emil.

  3. Note that he is from Sweden.

Key info:

  • Nodes often represents entities or discrete objects that can be classified with zero or more labels.

  • Data is stored as properties of the nodes.

  • Properties are simple key-value pairs.

Узлы
Neo4j хранит данные в графе в виде узлов

Простейший граф имеет только один узел с некоторыми именованными значениями, называемыми свойствами. Например, давайте нарисуем социальный график:

1. Нарисуйте круг для узла.

2. Добавьте имя Эмиль.

3. Обратите внимание, что он из Швеции.

Ключевая информация:

• Узлы часто представляют сущности или дискретные объекты, которые могут быть классифицированы с нулем или более меток.

• Данные хранятся в виде свойств узлов.

• Свойства представляют собой простые пары ключ-значение.

Labels

Associate 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.

  1. Add the label "Person" to the node you created for Emil.
  2. Color the "Person" node red.

Метки
Связывают набор узлов

Узлы можно сгруппировать вместе, применив метку к каждому элементу. На этом социальном графе вы помечаете каждый узел, представляющий человека.

  1. Добавьте метку "Человек" к узлу, который вы создали для Эмили.
  2. Покрасьте узел "Человек" в красный цвет.

More Nodes

Neo4j 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:

  1. Emil, Klout score of 99.

  2. Johan, from Sweden, who is learning to surf.

  3. Ian, from England, who is an author.

  4. Rik, from Belgium, who has a cat named Orval.

  5. Allison, from the US, who surfs.

Key info:

  • Similar nodes can have different properties.

  • Properties can hold different data types, such as `number`, `string`, or `boolean`.

  • Properties can also be a homogeneous list (array) containing strings, numbers, or boolean values.

  • Neo4j can store billions of nodes.

Больше узлов
Neo4j не содержит схем

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

  1. Эмиль, оценка Klout 99.

  2. Йохан из Швеции, который учится серфингу.

  3. Ян из Англии, автор.

  4. Рик из Бельгии, у которого есть кот по кличке Орвал.

  5. Эллисон из США, которая занимается серфингом.

Ключевая информация:

  • Похожие узлы могут обладать разными свойствами.

  • Свойства могут содержать различные типы данных, такие как "число", "строка" или "логическое значение".

  • Свойства также могут представлять собой однородный список (массив), содержащий строки, числа или логические значения.

  • Neo4j может хранить миллиарды узлов.

Relationships

Connect 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:

  1. Emil knows Johan and Ian.

  2. Johan knows Ian and Rik.

  3. Rik and Ian know Allison.

Key info:

  • Relationships always have a direction.

  • Relationships always have a type.

  • Relationships form patterns of data, the structure of the graph.

Отношения
Соедините узлы

Реальная мощь Neo4j заключается в подключенных данных. Чтобы связать любые два узла, добавьте отношение, описывающее, как связаны записи.

В нашем социальном графе вы можете просто указать, кто знает (тип отношений ЗНАЕТ) кого:

  • Эмиль знаком с Джоном и Яном.

  • Йохан знает Яна и Рика.

  • Рик и Йен знают Эллисон.

Ключевая информация:

  • Отношения всегда имеют определенное направление.

  • Отношения всегда имеют определенный тип.

  • Взаимосвязи формируют шаблоны данных, структуру графика.

Relationship properties

Store 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:

  • Emil has known Johan since 2001.

  • Emil rates Ian 5 (out of 5).

  • Everyone else can have similar relationship properties.

Key info:

  • Relationships always have a direction.

  • Relationships always have a type.

  • Relationships form patterns of data, the structure of the graph.

Свойства взаимосвязи
Хранят информацию, совместно используемую двумя узлами

В графе свойств взаимосвязи также могут содержать свойства, описывающие взаимосвязь. Рассматривая более внимательно отношения Эмили, обратите внимание, что:

• Эмиль знаком с Йоханом с 2001 года.

• Эмиль оценивает Яна на 5 (из 5).

• У всех остальных могут быть похожие свойства отношений.

Ключевая информация:

    • Отношения всегда имеют определенное направление.

    • Отношения всегда имеют определенный тип.

    • Взаимосвязи формируют шаблоны данных, структуру графика.