一、题目要求

  1. 编写程序先在MySQL存储两个表的数据
  2. 编写程序按照题目中所述逻辑从MySQL读取所需数据,在Neo4j中创建关系图
  3. 编写程序读取Neo4j关系图中每条边的信息,按照规定格式存储在MongoDB中

二、设计思路

1、首先是设计MySQL表格,存储数据。将table1中是否主动与是否被动字段设置为bit类型,节约存储空间。设置table1中数据ID为主键并设置auto_increment,免去每次插入数据设置ID。

2、读取MySQL数据,先从table1中获取相对于name独特的node,在neo4j中创立节点。再读取table2获取关系,经过判断发现,table2中participants按主动者至被动者存储,根据participants匹配node,在neo4j中创建relationship。

3、读取neo4j中存储的所有relationship,将其按一定格式插入MongoDB数据库中。

三、功能模块

四、程序设计

1、将数据存入MySQL数据库
插入数据在代码中固定,将关系时间设置为date类型,积极还是消极设置为bit类型。同时设置table1中id主键且自增。

将数据写入新创建的数据库中,然后关闭连接。

2、neo4j
接下来是连接通过neo4j,进行读取MySQL并创建node和relationship。
读取MySQL中的数据
获取所有person即人node。

获取所有关系即relationship。

之后就是对neo4j进行存储,利用for循环对所有relationship进行存储,获取到关系后,判读其两边node,在neo4j中创建relationship。

3、将neo4j中的relationship存入MongoDB中。
从neo4j中获取关系,将其转换为list类型,提供给MongoDB。

再通过获取到的relationships将其存入MongoDB数据库中

五、程序代码
(程序所有代码,标清题目)
1、将数据存入MySQL数据库

import pymysqlcon = pymysql.connect(host='localhost', user='root', password='123456', database='python_db', port=3306)
print(con)
# 创建游标对象
cur = con.cursor()# 创建表的sql
sql = """drop table if exists table1,table2;
"""
sql1 = """create table table1(id int primary key auto_increment,name varchar(20),relationship_ID int,active bit,passive bit);
"""sql2 = """create table table2(relationship varchar(20),time date,participants varchar(50),relationship_ID int)
"""
try:# 执行创建表的sqlcur.execute(sql)cur.execute(sql1)print("创建表1成功")cur.execute(sql2)print("创建表2成功")
except Exception as e:print(e)print("创建表失败")
finally:con.close()# 插入数据
con = pymysql.connect(host='localhost', user='root', password='123456', db='python_db', port=3306)cur = con.cursor()
sql1 = 'insert into table1(name,relationship_ID,active,passive) values(%s,%s,%s,%s)'
sql2 = 'insert into table2(relationship,time,participants,relationship_ID) values(%s,%s,%s,%s)'try:cur.executemany(sql1, [('王先生', 1, 1, 0),('李老师', 2, 1, 0),('李老师', 4, 1, 0),('小明', 3, 1, 0),('小红', 3, 0, 1),('小红', 4, 0, 1)])con.commit()print("插入表1成功")cur.executemany(sql2, [('丈夫', '20-12-10', '王先生,李老师', 1),('老师', '20-12-20', '李老师,小明', 2),('朋友', '20-12-25', '小明,小红', 3),('姑姑', '20-12-31', '李老师,小红', 4)])con.commit()print("插入表2成功")
except Exception as e:print(e)con.rollback()print("插入失败")
finally:con.close()

2、将数据从MySQL中读取存入neo4j中

import pymysql
from py2neo import Graph, Node, Relationshipdef mysql_persons():con = pymysql.connect(host='localhost', user='root', password='123456', db='python_db', port=3306)cur = con.cursor()# 判断发现table2中relation数据按照主动至被动顺序存储。sql = 'select * from (select  table1.*, row_number() over(partition by `name` order by relationship_ID desc) rn from table1) as a where rn = 1'try:cur.execute(sql)records = cur.fetchall()# for record in records:#     print(record)return recordsexcept Exception as e:print(e)print("查询失败")finally:con.close()def mysql_relationships():con = pymysql.connect(host='localhost', user='root', password='123456', db='python_db', port=3306)cur = con.cursor()# 判断发现table2中relation数据按照主动至被动顺序存储。sql = 'SELECT participants,relationship,time FROM `table2` WHERE relationship_ID IN (SELECT DISTINCT relationship_ID FROM `table1`);'try:cur.execute(sql)records = cur.fetchall()# for record in records:#     print(record[0])#     print(record[1])return recordsexcept Exception as e:print(e)print("查询失败")finally:con.close()def neo4j_init():test_graph = Graph("http://localhost:7474",username="neo4j",password="123456")test_graph.delete_all()nodes = []relationships = []persons = mysql_persons()i = 0for person in persons:print(person)name = person[1]nodes.append(Node('person', name=name))test_graph.create(nodes[i])i += 1connections = mysql_relationships()i = 0for data in connections:date_string = f'{data[2]:%m-%d}'name1 = data[0].split(',')[0]name2 = data[0].split(',')[1]relationship = data[1]for node in nodes:if node.__name__ == name1:node1 = nodeif node.__name__ == name2:node2 = noderelationships.append(Relationship(node1, relationship, node2))relationships[i]['time'] = date_stringtest_graph.create(relationships[i])i += 1if __name__ == '__main__':neo4j_init()

3、将数据从neo4j中读出存入MongoDB中

from py2neo import Graph, Node, Relationship, RelationshipMatcher
import pymongodef get_relationships():graph = Graph("http://localhost:7474",username="neo4j",password="123456")rel_match = RelationshipMatcher(graph)rel_list = list(rel_match.match())# for i in rel_list:#     print(i)return rel_listdef handler_db():mongo = pymongo.MongoClient(host='localhost', port=27017, tz_aware=True)mongo.drop_database('db')test = mongo.db.testposts = []relationships = get_relationships()i = 1for r in relationships:print(r)time = r['time']print(time)name1 = r.start_node.__name__print(name1)name2 = r.end_node.__name__print(name2)rela = type(r).__name__print(rela)posts.append({"_id": i,"人物": name1 + "," + name2,"时间": time,"主动者": name1,"被动者": name2,"时间名称": rela,"事件描述": name1 + rela + name2})i += 1for i in range(len(posts)):test.insert_one(posts[i])if __name__ == '__main__':handler_db()

程序运行结果:

Neo4j中数据

其中数据为根据MySQL中table2获得。通过participants判断relationship的start-node和end-node。将其加入至neo4j数据库中。

Mysql中数据


MySQL文件根据代码指定。设置participants中顺序为主动者至被动者。方便读取。

MongoDB中数据

MongoDB中数据根据neo4j中所有单方向relationship生成。

七、编程中遇到的困难和解决方法

1、在neo4j的安装时,有一个错误卡了很久,就是在最后创建relationship的时候总是提示有错误,查遍了csdn和一些中文博客都找不到正确的方法。后来偶然一次打开了py2neo的文档,里面有提到解决方法,最后根据这个方法成功的解决了问题。

八、总结心得及良好的建议
总结心得
通过这次课设,我真切的了解了各种数据特点及其使用和运行,而不是像课程里面对理论知识的理解,并且进行了一些基本的应用。这门课设是目前为止,我在大学中遇到的综合性最强的一门课。学会操作不够,还需要有数据库的基础、以及编写代码基础等等,将之前学到的很多知识结合起来,这是对个人综合能力的一次很好的锻炼。

python,真·脚本语言。

neo4j,MongoDB相关推荐

  1. PostgreSQL,MongoDB,Neo4j,OrientDB和ArangoDB比较

    基准:PostgreSQL,MongoDB,Neo4j,OrientDB和ArangoDB 2015年10月13日表现 在这篇博客文章 - 这是一个综合的表现博客系列 - 我想完成我们的NoSQL性能 ...

  2. 关系型数据库(Relational Database)与非关系型数据库(NoSQL)的区别:(MySQL,Redis,Memcache,MongoDB)

    Table of Contents 关系型数据库(Relational Database) 什么是关系数据库 什么是SQL? 关系数据库的结构 关系模型 关系数据库的好处 数据一致性 隔离性和原子性 ...

  3. Mongodb 集群加keyFile认证,Mongodb用户管理(转:http://blog.csdn.net/wlzjsj/article/details/61421230)

    介绍 自从远古计绳结开始,数据库的存储就注定了今天的地位和多样性,Nosql的出现更是解决了现有的关系型数据库无法解决的一些难题,对高性能,灵活度,扩展性,海量数据的问题.随之而出现的高速内存索引数据 ...

  4. Docker-compose配置Mysql,Redis,MongoDB

    Docker-compose下配置Mysql,Redis,MongoDB详解 一.docker-compose简介 二.构建一个实例项目 1.前后端实现 2.Dockerfile及docker-com ...

  5. mongodb实验报告_Dropwizard,MongoDB和Gradle实验

    mongodb实验报告 介绍 我使用Dropwizard,MongoDB和Gradle创建了一个小项目. 它实际上是作为一个实验性的Guava缓存开始的,作为将计数器发送到MongoDB(或任何其他D ...

  6. crawler4j_迷你搜索引擎–使用Neo4j,Crawler4j,Graphstream和Encog的基础知识

    crawler4j 继续执行正在实现搜索引擎的Programming Collection Intelligence (PCI)的第4章. 我可能比做一次运动所咬的东西要多. 我认为,与其使用本书中所 ...

  7. Dropwizard,MongoDB和Gradle实验

    介绍 我使用Dropwizard,MongoDB和Gradle创建了一个小项目. 它实际上是从一个实验性的Guava缓存开始的,作为将计数器发送到MongoDB(或任何其他DB)的缓冲区. 我也想尝试 ...

  8. 迷你搜索引擎–使用Neo4j,Crawler4j,Graphstream和Encog的基础知识

    继续执行正在实现搜索引擎的Programming Collection Intelligence (PCI)的第4章. 我可能比做一次运动所咬的东西要多. 我认为, 与其一直使用本书中使用的普通关系数 ...

  9. Spring Data,MongoDB和JSF集成教程

    示例应用程序简介(MongoShop产品目录) 在学习完本教程之后,将构建具有以下功能要求的示例应用程序(MongoShop产品目录): 1.搜索具有不同条件的产品(例如,sku,产品类型,标题,st ...

最新文章

  1. 授权管理【学习笔记】《卓有成效的管理者》 第二章 掌握自己的时间
  2. c/s 自动升级(WebService)
  3. APK反编译得工具总结(转载)
  4. 方程式漏洞之复现window2008/win7 远程命令执行漏洞
  5. dabeicun 2013源码下载
  6. c语言图像压缩算法实现_kakadu——JPEG2000图像压缩软件的安装和使用
  7. Linux之系统操作命令
  8. java udp 线程,Java中的UDP DatagramSocket线程的高CPU使用率
  9. 【C++笔记】对象模型和this指针
  10. 高效程序员秘籍(9):快速查找硬盘上的文件和目录
  11. JDK、STS、SVN、Tomcat 、mysql的下载安装及环境变量的配置和sts修改字体大小
  12. Pandas + Jinja,轻松创建一个 PDF 报表
  13. 手机网站如何制作,移动网站怎么建设?
  14. 物联网是什么,和互联网之间主要有什么区别
  15. SQL Server 2019下载及安装教程
  16. springboot系列课程笔记-第一章-Spring Boot入门
  17. [调研] 人脸/车牌脱敏 调研
  18. Android 用官方SDK实现第三方(qq、微信、微博等)分享和登录
  19. 原生JS实现躲避粒子小游戏
  20. 南京热门美食网html,江苏南京十大特色美食排名榜单揭晓

热门文章

  1. Android手机AP模式下本机IP
  2. #ifndef的神仙用法
  3. 用Python 操作 Excel,这篇文章别错过了!(超全总结)
  4. GlusterFS基本概念
  5. PCB(AD)转HFSS进行电磁仿真
  6. 交叉编译时不要忘记-march编译选项
  7. 人工智能和计算机视觉(5)-边缘检测
  8. 计算机如何查看网络延时,电脑上怎么看网络丢包?网络延时查看方法
  9. 【机器学习】线性分类——高斯判别分析GDA(理论+图解+公式推导)
  10. 大学JAVA实验六 学生选课管理系统