暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python实现之数据血缘关系,by networkx

669

最近在进行数据逆向分析,无业务无界面无数据库的情况下,想通过对存储过程中关于输出输入表的分析快速了解业务的核心问题,然后再对核心业务进行逆向回溯。

其实问题很简单,一个存储过程会有多个输入表和输出表,一个存储过程的输出表可能会成为另外一个存储过程的输入表,从而将整个数据库的业务逻辑串接起来,基于长链会形成血缘关系,基于关联会形成聚合。

这里需要构造的节点数据和连接数据,节点数据是输入表和输出表剔重后的编号和标签,连接数据通过存储过程标签将节点数据进行关联。

代码之前有测试过,所以这次实现无太多需要讲解。


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# _ooOoo_
# o8888888o
# 88" . "88
# ( | - _ - | )
# O\ = O
# ____/`---'\____
# .' \\| |// `.
# \\|||:|||// \
# _|||||-:- |||||- \
# | | \\\ - | |
# | \_| ''\---/'' | _/ |
# \ .-\__ `-` ___/-.
# ___`. .' --.--\ `. . __
# ."" '< `.___\_<|>_/___.' >'"".
# | | : `- \`.;`\ _ `;.`/ - ` : | |
# \ \ `-. \_ __\ __ _/ .-`
# ==`-.____`-.___\_____/___.-`____.-'==
# `=---='
'''
@Project pythonalgorithms
@File xueyuan.py
@Author :不胜人生一场醉@Date 2021/8/23 11:06
'''
# !/usr/bin/env python
# -*- coding: UTF-8 -*-
# _ooOoo_
# o8888888o
# 88" . "88
# ( | - _ - | )
# O\ = O
# ____/`---'\____
# .' \\| |// `.
# \\|||:|||// \
# _|||||-:- |||||- \
# | | \\\ - | |
# | \_| ''\---/'' | _/ |
# \ .-\__ `-` ___/-.
# ___`. .' --.--\ `. . __
# ."" '< `.___\_<|>_/___.' >'"".
# | | : `- \`.;`\ _ `;.`/ - ` : | |
# \ \ `-. \_ __\ __ _/ .-`
# ==`-.____`-.___\_____/___.-`____.-'==
# `=---='
'''
@Project pythonalgorithms
@File graphdatastructure.py
@Author :不胜人生一场醉@Date 2021/7/16 22:18
'''
import networkx as nx
import matplotlib.pyplot as plt
from graphviz import Source
import pygraphviz as pgv

# 获得图中非连通点的列表 = []
if __name__ == "__main__":
nodes, edges = getnodeedge()
testGraphlabelpic(nodes, edges)




def testGraphlabelpic(nodes, edges):
g = nx.DiGraph()
g.add_nodes_from(nodes)
g.add_edges_from(edges)
plt.figure(figsize=(30, 18))
pos = nx.spring_layout(g,iterations=20)
# pos = nx.kamada_kawai_layout(g)
# pos = nx.random_layout(g)
# 调用draw(G, pos)将基础的点边拓扑先画出来
nx.draw(g, pos)

# 画节点
nx.draw_networkx_nodes(g, pos=pos, node_color='#7FFF00', node_size=150, alpha=0.7)
node_labels = nx.get_node_attributes(g, 'name')
# 调用draw_networkx_labels画节点标签
nx.draw_networkx_labels(g, pos, labels=node_labels)

# 画边
nx.draw_networkx_edges(g, pos=pos, width=0.3, alpha=0.2) # 边的样式
edge_labels = nx.get_edge_attributes(g, 'procname')
# 调用draw_networkx_edge_labels画和边的标签。
nx.draw_networkx_edge_labels(g, pos, edge_labels=edge_labels)
plt.savefig('aa.jpg')
plt.show()
nx.drawing.nx_agraph.write_dot(g, "dot.gv")
Source.from_file('dot.gv')


# gvd = pgv.AGraph(directed=True)
# gvd.add_nodes_from(nodes)
# gvd.add_edges_from(edges)
# gvd.layout(prog='neato')
# gvd.draw('pygraph.png')
def getnodeedge():
file = open('nodes.txt', 'r')
content = file.readlines()
rows = len(content) # 文件行数
nodes = []
nodenamedict = dict()
for i in range(rows):
data = content[i].strip().split('\t')
nodenamedict['name'] = data[1]
nodes.append([int(data[0]), nodenamedict])

file = open('edge.txt', 'r')
content = file.readlines()
rows = len(content) # 文件行数
edges = []
edgenamedict = dict()
for i in range(rows):
data = content[i].strip().split('\t')
edgenamedict['procname'] = data[2]
edges.append([int(data[0]), int(data[1]), edgenamedict])
return nodes, edges









文章转载自python与大数据分析,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论