返回小栈
关于neo4j图数据库笔记三-初见成效
bq_wang2020-02-19 09:57:09

前两个部分尝试了一下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进行结果展示,实际上是两个独立的测试系统,以及在生产系统中两个业务系统去访问同一个数据库。




1
0