利用neo4j做数据图谱管理数据库表(一)
@TOC背景近几年,随着数据中台的概念迅速红火,越来越多的企业正在或者正在准备打造自己的数据中台,数据中台需要汇集公司全业务流,全生产环节产生的数据,庞大的数据资源进来出去势必对数据的管理提出新的挑战,如何高效便捷的管理好这些数据流也是数据中台建设环节中一项重要且很有意义的基础工作,目前有行业里常用的数据库文档的管理方式有使用excel(word)文档管理;使用powerdesigner管理;在代
@TOC
背景
近几年,随着数据中台的概念迅速红火,越来越多的企业正在或者正在准备打造自己的数据中台,数据中台需要汇集公司全业务流,全生产环节产生的数据,庞大的数据资源进来出去势必对数据的管理提出新的挑战,如何高效便捷的管理好这些数据流也是数据中台建设环节中一项重要且很有意义的基础工作,目前有行业里常用的数据库文档的管理方式有
-
使用excel(word)文档管理;
-
使用powerdesigner管理;
-
在代码中维护或使用sql审核工具如archerry,并且使用pd做反向工程;
上面三种管理方式都普遍过多依赖于开发人员和数据管理人员的自主能动性,时间一久必然出现各种各样的问题,比如
-
excel(word)文档维护,需要在建库建表的时候在数据库的环境操作一遍又到excel(word)文档操作一遍,如果两边不同步到后面就变得乱七八糟的,实际生产环境的情况和管理文档的情况差异会越来越大;
-
使用powerdesigner维护,虽然初期可以通过它进行建模,但是后续的产品迭代更新,尤其是高频更新迭代,极有可能导致管理文档powerdesigner的信息与实际生产库表信息完全不一样;
-
第三种方式比较可取,但是同样不够直观,因为它照样没办法维护关系,也仅仅解决了迭代上线的审核问题。
所以需要设计一套高效的便捷的数据库文档管理办法,这套办法必须满足一下几条特性
(1) 同步性
同步性是指生产环境和文档管理环境建立的所有库表能够即时同步,两者的信息完全一致;
(2) 简洁性
数据库管理文档虽然是指导开发人员和方便DBA管理数据库的工具,在使用过程中能够方便读懂,甚至基于数据中台的机器学习人员也能一眼就明了公司数据资源的关系以及各种库表的关系;
(3) 易维护性
易维护性有两层含义,一层是数据文档管理人员只需要维护一端的库表,比如只要维护生产环境的库表,或者只要维护数据库管理文档环境的库表,而不需要两边都进行相同的操作;一层是各种库表之间的千丝万缕的关系能够通过某些配置进行批处理;
(4) 建模功能
建模功能与易维护性有点类似,但是又不同于易维护性,建模功能是指能够将各种库表之间的关系抽象成数学模型,使得开发人员能够在文档管理平台进行数据库表的建设工作,自动生成平时操作性数据库的SQL语言等功能,而不需要在实际生产环境再写一遍SQL;
neo4j图数据库
虽然市面上满足如上4条的开源工具还不成熟,但是也是可以做一些尝试,比如neo4j图数据库,neo4j图数据库是基于图论实现的一种新型NoSQL数据库,图数据库在展现和管理各种千丝万缕的关系的时候更加形象。图论中图分为有向图和无向图,图的基本元素为节点和边,在图数据库中对应的就是节点和关系以及附属在他们之上的属性。
- 节点(node):一个实体记录,就像关系型数据库中的一条记录。一个节点可以包含多个属性和标签;
- 关系(relationship):各种实体之间的关联关系;
- 属性(property):由键值对组成的,如同python里面的字典;
- 标签(lable):一组拥有相同属性的节点,但不强制要求相同,一个节点可以有多个标签;
- 路径(path): 从某一个节点到另一个节点走过的路线,打个比方,需要从一个库下面的某个表某个字段关联到另一个库下面的某个一表某一个字段就是一条路径;
建模
有了上面的一些概念之后,我们可以着手建模工作了,对应的我们可以设计
- 库,表和字段都当成节点(node);
- 库与表之间的关系(relationship),表与字段之间的关系(relationship),字段与字段之间的关系(relationship);
- 库的中文名,约束条件,表的中文名,约束条件,字段的中文名,约束条件,数据类型等都当成他们拥有的属性(property);
画出来如下

第一阶段
在第一阶段,我们只准备构建一个数据库下的所有表的所有字段的图网络,其中包含
- 节点,一个库(schema),该库下的所有表(table),所有表的所有字段(column);
- 关系, 这个库与这个库下所有表的包含(contain)关系,所有表与其里面字段的构成(consist)关系;
- 属性,(字段的中文名属性,数据类型属性)
代码
# -*- encoding: utf-8 -*-
'''
@Project : 数据图谱
@Desc : 利用neo4j图数据库构建IFS数据中台的元数据图谱关系
@Time : 2021/02/09 21:50:11
@Author : 帅帅de三叔,zengbowengood@163.com
'''
import pymysql
import pandas as pd
from py2neo import Graph,Node, Relationship
db = pymysql.connect(host = "**********", user = "**********", password = "**********", database = "ods") #连接MySQL数据库
c_sql = 'select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT from information_schema.columns where TABLE_SCHEMA="ods"'
graph = Graph("http://localhost:7474", username="neo4j", password="**********") #连接到neo4j库,初始化neo4j数据库
info = pd.read_sql(c_sql, db) #获取关键信息
schemas = info["TABLE_SCHEMA"].unique() #数据库
for schema in schemas:
schema_node = Node("schema", name=schema) #定义数据库节点
graph.create(schema_node) #创建库节点
tables = info[info["TABLE_SCHEMA"]==schema]["TABLE_NAME"].unique() #表名
for table in tables:
table_node = Node("table", name = table) #定义表节点
graph.create(table_node) #创建表节点
rel_schema_table = Relationship(schema_node, "contain", table_node) #定义库与表之间的关系
graph.create(rel_schema_table) #为库与表之间创建一层关系
column_names = info[(info["TABLE_SCHEMA"]==schema)&(info["TABLE_NAME"]==table)]["COLUMN_NAME"] #字段名
column_types = info[(info["TABLE_SCHEMA"]==schema)&(info["TABLE_NAME"]==table)]["COLUMN_TYPE"] #字段数据类型
column_comments = info[(info["TABLE_SCHEMA"]==schema)&(info["TABLE_NAME"]==table)]["COLUMN_COMMENT"] #字段数据中文含义
for column_name, column_type, column_comment in zip(column_names, column_types, column_comments):
props = {"data_type": column_type, "comment": str(column_comment)} #字段的属性,以字典形式构造
column_node = Node("column", name = column_name, **props) #定义字段节点及其属性, **props
graph.create(column_node) #创建列节点
rel_table_col = Relationship(table_node, "consist", column_node) #定义表节点与字段节点之间的关系
graph.create(rel_table_col) #为表与字段之间创建一层关系
代码解读
1,连接到服务器端的MySQL数据库,获取TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT关键字段形成一张原始数据表;
2,连接到本地neo4j库,初始化neo4j数据库,形成graph对象;
3,利用原始数据表的TABLE_SCHEMA创建schema节点, TABLE_NAME创建table节点, COLUMN_NAME创建字段节点,利用COLUMN_TYPE, COLUMN_COMMENT为字段节点创建属性;
4,为schema节点和table节点之间建立contain关系,为table节点和column节点之间建立consist关系;
5,为column节点追加数据类型和中文名属性;
第二阶段
1,其中字段的comment属性创建失败,可能因为是中文的缘故;
2,需要为字段与字段之间,表与表之间构建关联关系;
参考文献
更多推荐





所有评论(0)