将Mysql数据导入Neo4j的两种方式

1、简介

     本篇文章演示将Mysql数据导入Neo4j的两种方式:第一种:编写python脚本;第二种:使用Cypher语言的Load CSV功能

2、必要条件

1、安装docker,这里提供安装教程   https://blog.csdn.net/wangyan_z/article/details/95966896?spm=1001.2014.3001.5501

2、docker安装Neo4j,用户名和密码在如下命令里的NEO4J_AUT自定义

docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -v /home/neo4j/data:/data -v /home/neo4j/logs:/logs -v /home/neo4j/conf:/var/lib/neo4j/conf -v /home/neo4j/import:/var/lib/neo4j/import -e NEO4J_AUTH=neo4j/test neo4j

 

3、Python脚本,以两个实体一个关系为例【简单脚本,本地使用还需修改】

# coding:utf8
# @Time : 2021/4/16 15:09 
# @File : mysql2neo4j.py 
# @Return: 从mysql 抽取数据到neo4j
import pymysql
import pandas as pd
from neo4j import GraphDatabase

# Neo4j图数据库连接
uri = "neo4j://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "test"))
# Mysql数据库连接
conn = pymysql.connect(host = 'localhost',user = 'root',passwd = 'root',db = 'db',port=3306)
cursor = conn.cursor()

def create_entity_node(tx,tabel_name):
    sql = 'select *  from {}'.format(tabel_name)
    dw = pd.read_sql(sql, conn)
    col_name = dw.columns
    node_cls = tabel_name
    name_d = {}

    for inx, row in dw.iterrows():
        neo4j_sql = "CREATE (n:%s { " % node_cls
        for p_name in col_name:
            name_d[p_name] = row[p_name]
            neo4j_sql = neo4j_sql + p_name + ":" + "\'" + row[p_name] + "\',"
        neo4j_sql = neo4j_sql[:-1] + "}) RETURN n"
        print(neo4j_sql)
        # 逐行写入
        tx.run(neo4j_sql)

def create_relation(tx, head_table, relation_table,  tail_table):
    create_entity_node(tx, head_table)
    create_entity_node(tx, tail_table)
    sql = 'select *  from {}'.format(relation_table)
    dw = pd.read_sql(sql, conn)
    col_name = dw.columns
    begin_node_cls = head_table
    #实体表映射到关系表的字段
    begin_relation_line = '单位编码'
    end_relation_line = '规划编号'
    end_node_cls = tail_table
    relation_name = relation_table

    for inx,row in dw.iterrows():
        neo4j_sql = "MATCH (a: %s { %s:" %  (begin_node_cls, begin_relation_line)
        neo4j_sql +=  "\'" + row[begin_node_cls] + "\' }), (b: %s { %s:" % (end_node_cls, end_relation_line)
        neo4j_sql += "\'" + row[end_node_cls] + "\'}) "
        neo4j_sql += "MERGE (a)-[:%s {" %  relation_name

        for p_name in col_name:
            if row[p_name]!=None:
                neo4j_sql = neo4j_sql + p_name + ":" +"\'" + row[p_name] + "\',"
        neo4j_sql = neo4j_sql[:-1] + "}] ->(b)"
        print(neo4j_sql)
        # 逐行写入
        tx.run(neo4j_sql)


# example
with driver.session() as session:
    session.write_transaction(create_relation, '单位', "拟制五年规划", '五年规划')  #这里传参为create_relation方法的三个参数

driver.close()

4、使用Cypher语言的Load CSV功能

     首先,需要进入Neo4j容器【命令:docker exec -it 容器id bash】找到conf/neo4j.conf文件,在里面添加配置dbms.directories.import=import【使得在import目录下上传的csv文件有效】

                

     其次,从Mysql数据库导出表数据【CSV格式】,上传至Neo4j容器的import路径下

     最后,在Neo4j的浏览器端【http://localhost:7474/browser/】登录之后,执行CSV命令

// example
LOAD CSV FROM "file:///actors.csv" AS line CREATE(a:actors{id:line.personId,name:line.name,type:line.type})  //line.表头字段

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值