見出し画像

10.pythonのDB -Neo4j-

◼︎neo4j

グラフ構造を持ったデータの保存、探索、集計に最適化されたデータベースです。

neo4jについて

◼︎◼︎Docker

FROM neo4j

◼︎◼︎docker-compose.yml

NEO4J_AUTHをnoneとすることで、ログイン時に認証を求めなくなります。
開発だけの時は、利用した方が便利かも。

version: '3'

services:

  neo4j_datavolume:
    image: busybox
    volumes:
    - /data/dbms

  neo4j_core1:
    build: .
    ports:
      - 7473:7473
      - 7474:7474
      - 6477:6477
      - 7687:7687
    volumes_from:
      # busyboxでデータの永続化を行う
      - neo4j_datavolume
#      environment:
#      - NEO4J_AUTH=none
#      - NEO4J_AUTH=neo4j/changeme
#      - NEO4J_dbms_mode=CORE
#      - NEO4J_causalClustering_expectedCoreClusterSize=3
#      - NEO4J_causalClustering_initialDiscoveryMembers=neo4j_core1:5000
#      - NEO4J_dbms_connector_http_listen__address=:7474
#      - NEO4J_dbms_connector_https_listen__address=:6477
#      - NEO4J_dbms_connector_bolt_listen__address=:7687

◼︎◼︎python

from neo4j.v1 import GraphDatabase

# api形式で利用する際は、boltでアクセス先を指定する。今回はauthを利用するのでauthも記載する。passwordは事前にbrowserからアクセスして変更する。
driver = GraphDatabase.driver('bolt://localhost:7687', auth=('neo4j', 'passsword'))

def clearDb(tx):
    tx.run('MATCH (n) DETACH DELETE n')

def addFriend(tx, name, friendName=None):
    if not friendName:
        return tx.run('CREATE (p:Person {name: $name}) RETURN p', name=name)
    return tx.run('MATCH (p:Person {name: $name}) CREATE (p)-[:FRIEND]->(:Person {name: $friend_name})', name=name, friend_name=friendName)

def printFriend(tx, name):
    for record in tx.run('MATCH (p {name: $name}) - [:FRIEND] -> (yourFriends) RETURN p,yourFriends', name=name):
        print(record)

with driver.session() as session:
    # 実行前に全削除
    session.write_transaction(clearDb)
    
    # Tomを追加(友人なし)
    session.write_transaction(addFriend, 'Tom')

    # Tomを追加(友人あり)
    for f in ['Sum', 'Nancy']:
        session.write_transaction(addFriend, 'Tom', f)

    '''
    <Record p=<Node id=0 labels={'Person'} properties={'name': 'Tom'}> yourFriends=<Node id=20 labels={'Person'} properties={'name': 'Nancy'}>>
    <Record p=<Node id=0 labels={'Person'} properties={'name': 'Tom'}> yourFriends=<Node id=1 labels={'Person'} properties={'name': 'Sum'}>>
    '''
    session.read_transaction(printFriend, 'Tom')

◼︎◼︎neo4jのグラフ


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