[技術日誌]グラフDBなるものがあるらしい

最短経路探索を趣味で取り組んでるのですが、グラフDBなるものを使うケースもあると聞きました。
Hello World的なものまでやってみます。

参考サイト:

ディレクトリ構成

neo4j_docker/
       ├ src/
       |   ├ neo4j_test.py
       |   └ search_test.py
       ├ python_docker/
       |     ├ Dockerfile 
       |     └ requirements.txt
       └ docker-compose.yml

Dockerfile(Python)

Dockerfile:

FROM python:3.10.5

RUN apt-get update
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install neo4j-driver

docker-compose

docker-compose.yml:

version: '3'

services:
  neo4j:
    image: neo4j:4.2.5
    container_name: my_neo4j
    ports:
      - 7474:7474
      - 7687:7687
    volumes:
      - ./neo4j/data:/data

  python:
    build: ./python_docker
    container_name: my_python3
    tty: true
    volumes:
      - ./:/workspace

Pythonコード

./src/neo4j_test.py:

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.write_transaction(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://my_neo4j:7687", "neo4j", "docker")  # HelloWorldExample(url, user, password)
    greeter.print_greeting("hello, world")
    greeter.close()

./src/search_test.py:

from neo4j import GraphDatabase

driver = GraphDatabase.driver('bolt://my_neo4j:7687', auth=('neo4j', 'docker'))
session = driver.session()
for i in session.run('MATCH (n) RETURN n LIMIT 25'):
    print(i['n'])
session.close()

コンテナ作成

下記のコマンドでコンテナを作成します。

 docker compose up -d 

Neo4jの初期設定

下記のURLからNeo4jに接続します。
http://localhost:7474/browser
初期のユーザー名とパスワードはどちらも「neo4j」です。
その後、新規のパスワードに更新します。
一旦、パスワードは「docker」とします。

これで、Neo4jの準備が整いました。

テスト実行

下記のコマンドでPythonのコンテナの中に入ります。

docker compose exec python bash

下記のコマンドでデータを作成します。

workspace# python src/neo4j_test.py 
hello, world, from node 0

検索のテストも実行します。

workspace# python src/search_test.py 
<Node id=0 labels=frozenset({'Greeting'}) properties={'message': 'hello, world'}>

続きの予定

次は交通ネットワークを入れたいです。
データはOpen Street Mapを使います。


この記事が気に入ったらサポートをしてみませんか?