前两个部分尝试了一下neo4j和py2neo的基本语法,证实了图库在运维实体中实现的可行性,先对数据结构做了一下调整,在服务器节点上增加了label,主要用来区别数据库还是应用服务器,在访问关系中也增加了源和目标的label值,主要是考虑到数据库和应用还是有很大区别的,数据库可以是多个业务系统的数据库,数据库本省也存在RAC、Dataguard、VIP、物理IP、ScanIP等多个概念,目前还没完全构思好,暂且只是简单分一下类。
另外一个是在图库需要进行数据初始化,在这个过程中引入了csv文件读取,以及通过DictReader实现数据和标题的字典化,再根据实际需要,按照节点和关系的要求,对数据进行初始化操作,当然通过这种方式进行数据初始化效率是比较低的,快的还是通过neo4j的导入功能来实现。
以下为调整后的数据结构
以下为在笔记二系列基础上增加的初始化脚本,并修改了main执行函数
import csv
def initnode(self,filename):
#初始化节点
with open(filename, 'r', encoding="utf-8") as f:
dict_reader = csv.DictReader(f)
for row in dict_reader:
propertys = {}
for k, v in row.items():
#单独处理节点的label值
if k == 'label': labelname=v
propertys[k] = v
#调用创建节点类
self.createNode(label=labelname, properties=propertys)
def initrelation(self,filename):
#初始化关系节点
with open(filename, 'r', encoding="utf-8") as f:
dict_reader = csv.DictReader(f)
for row in dict_reader:
relationpropertys = {}
#label是match中必须要加的,节点name是的,关系属性也单独解析
for k, v in row.items():
if k == 'sourcetype':
sourcenodetype=v
elif k == 'soure':
startnodename = v
elif k == 'desttype':
destnodetype=v
elif k == 'dest':
endnodename=v
elif k == 'nettype':
nettype=v
else:
relationpropertys[k] = v
#通过label和name属性分别查找开始节点和结束节点
startnode = self.findOneNode(node_type=sourcenodetype, properties={'name': startnodename})
endnode = self.findOneNode(node_type=destnodetype, properties={'name': endnodename})
#调用createRelationship创建关系
dao.createRelationship(start_node=startnode, relation_type=nettype,end_node=endnode, relation_properties=relationpropertys)
if __name__ == '__main__':
dao = Neo4jDao(username='neo4j', password='Wbq197711')
dao.deleteall()
dao.initnode('nodes.csv')
nodes = dao.findAllNode(node_type='app')
print(nodes)
nodes = dao.findAllNode(node_type='db')
print(nodes)
dao.initrelation('relations.csv')
relations = dao.findAllRelationship()
print(relations)
后通过neo4j进行结果展示,实际上是两个独立的测试系统,以及在生产系统中两个业务系统去访问同一个数据库。