[技術日誌]グラフ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を使います。
この記事が気に入ったらサポートをしてみませんか?