博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python pymongo+networkx 实现mongo数据血缘关系可视化
阅读量:6440 次
发布时间:2019-06-23

本文共 2864 字,大约阅读时间需要 9 分钟。

  hot3.png

数据血缘通常是指数据产生的链路,其采集主要通过自动解析(存储过程、SQL、ETL过程等文件)结合人工收集的方式实现。本文不涉及数据血缘如何获取,只对如何通过python操作mongodb并可视化数据血缘关系提供一些思路。

首先通过pymongo连接本地数据库,并插入测试数据

import pymongomyclient = pymongo.MongoClient("mongodb://127.0.0.1:27017/")mydb = myclient["world"]mycol = mydb["areas"]mylist = [{ "_id" : 1, "name" : "Asia" },{ "_id" : 2, "name" : "China", "belongsto" : "Asia" },{ "_id" : 3, "name" : "ZheJiang", "belongsto" : "China" },{ "_id" : 4, "name" : "HangZhou", "belongsto" : "ZheJiang" },{ "_id" : 5, "name" : "NingBo", "belongsto" : "ZheJiang" },{ "_id" : 6, "name" : "Xihu", "belongsto" : "HangZhou" }]x = mycol.insert_many(mylist)for x in mycol.find():  print(x)

输出结果: 

{'_id': 1, 'name': 'Asia'}

{'_id': 2, 'name': 'China', 'belongsto': 'Asia'}
{'_id': 3, 'name': 'ZheJiang', 'belongsto': 'China'}
{'_id': 4, 'name': 'HangZhou', 'belongsto': 'ZheJiang'}
{'_id': 5, 'name': 'NingBo', 'belongsto': 'ZheJiang'}
{'_id': 6, 'name': 'Xihu', 'belongsto': 'HangZhou'}

递归查询name='Xihu'这个节点的父节点

pipeline = [{'$graphLookup': {          'from': "areas",          'startWith': "$belongsto",          'connectFromField': "belongsto",          'connectToField': "name",          'as': "belongHierarchy"       }},{'$match': {'name' : 'Xihu'}}]for doc in (mycol.aggregate(pipeline)):    print (doc)

输出结果: 

{'_id': 6, 'name': 'Xihu', 'belongsto': 'HangZhou','reportingHierarchy':

[{'_id': 1, 'name': 'Asia'},

{'_id': 2, 'name': 'China', 'belongsto': 'Asia'},

{'_id': 3, 'name': 'ZheJiang', 'belongsto': 'China'},

{'_id': 4, 'name': 'HangZhou', 'belongsto': 'ZheJiang'}]}

解析输出结果并可视化展示节点关系

import networkx as nximport matplotlib.pyplot as plt  rs = list(mycol.aggregate(pipeline))def get_relation(rs):    G = nx.DiGraph()    for node in rs:        try:            G.add_edge(node['name'], node['belongsto'])            for item in node['belongHierarchy']:                if 'belongsto' in item.keys():                    G.add_edge(item['name'], item['belongsto'])                else:                    pass        except:            pass    return GG = get_relation(rs)nx.draw(G, with_labels=True, font_weight='bold')plt.show()

5036fef2b51fb4eea2b268ba2be1acf99ce.jpg

展示area这个collection中所有的节点

pipeline = [{'$graphLookup': {          'from': "areas",          'startWith': "$belongsto",          'connectFromField': "belongsto",          'connectToField': "name",          'as': "belongHierarchy"       }}]rs = list(mycol.aggregate(pipeline))def get_relation(rs):    G = nx.DiGraph()    for node in rs:        try:            G.add_edge(node['name'], node['belongsto'])            for item in node['belongHierarchy']:                if 'belongsto' in item.keys():                    G.add_edge(item['name'], item['belongsto'])                else:                    pass        except:            pass    return GG = get_relation(rs)nx.draw(G, with_labels=True, font_weight='bold')plt.show()

67ce92147e73656dc1b2191647bb6a1e3bf.jpg

转载于:https://my.oschina.net/aubao/blog/3035977

你可能感兴趣的文章
京东要做IPv6急行军
查看>>
HanLPTokenizer HanLP分词器
查看>>
对话阿里云Alex Chen:下一代存储应如何面对云转型?
查看>>
阿里云大数据计算服务MaxCompute使用教程
查看>>
一篇文章带你入门Zookeeper
查看>>
IntelliJ IDEA 2018.3 正式版发布!
查看>>
使用Cubic Spline通过一组2D点绘制平滑曲线
查看>>
Mockplus ▪ UXPA第八届中国用户体验设计成都赛区决赛成功举行
查看>>
仿京东Tab商品切换
查看>>
一个类似抖音 APP 拍摄按钮效果的控件
查看>>
Swift 简单总结
查看>>
asp.net core mvc 中间件之WebpackDevMiddleware
查看>>
Word2Vec之Skip-Gram与CBOW模型原理
查看>>
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色_21.3. 角色成员关系...
查看>>
Android冷启动白屏问题
查看>>
Android开发之Activity转场动画
查看>>
“阿里通信云对讲 从此沟通无难事”渠道分销合作伙伴大会盛大召开
查看>>
OpenSearch在线干预服务
查看>>
Java 8 中的 Streams API 详解
查看>>
Redis 复制(学习笔记六)
查看>>