2020/07/08 -
引言
本篇文章我来简单介绍一下怎么利用python来使用这个neo4j,不涉及具体原理,本次只是描述具体的使用过程;从这个过程中再分支出具体的使用过程。
本次我测试的数据是两个,一个是DNS数据,文本内容是host,dns,还没有涉及请求的是什么,因为我想不通这个关系是什么;另外一个数据是网站请求数据,这个数据就稍微多了几列,但核心就是host和网站的内容。那么从这两个数据中,我就是把这个访问的关系给绘制出来,具体挖掘什么信息,比如什么社群发现,我是暂时想不出来这层语义是什么。
本文主要阐述了使用CSV格式的数据,数据中只有两个节点的信息(可以多种,代码自行调整),然后绘制他们的关系。代码运行没问题,但也产生了一些问题,目前待解决:
1)如何添加属性等信息
2)如何批量节点信息
3)我这里是采用去重的方式来实现了插入,但是正确的姿势应该是什么呢?
搭建数据库
这里使用docker的方式进行搭建,一开始选了最新版,在修改密码的界面一直卡着,通过开发者工具的形式,我就发现了原因是他某个请求发完了127.0.0.1,感觉是个bug。所以最后选择了neo4j:3.4。启动命令:
docker run -it -p 7474:7474 -p 7687:7687 neo4j:3.4
其中7474是web的接口,同时看到后面的python的调用方式,估计他是使用httpapi来通信的把。
python库
python库使用的是py2neo,正常安装就好了
全部代码
#! /bin/python2
#coding:utf-8
#Author:VChao
#2020/07/08
from py2neo import Graph, Node, Relationship
#连接数据库
graph = Graph("http://10.245.142.250:7474",username = "neo4j", password = "wangchao")
#删除所有数据
graph.delete_all()
#读取数据
with open("src_dst_ip.csv","r") as f:
data = f.readlines()
data = map(lambda x: x.strip(), data)
##这里插入数据的方式是先去重,然后对每个IP都建立一个节点,并将这个节点都存入列表中
##读取原始数据的关系,每次都获取出来关系信息,按照ip从前面创建的节点中来加入关系
##因为创建关系的时候,需要利用Node对象作为点
src_ip_list = list(set(map(lambda x: x.strip().split(",")[0], data)))
dst_ip_list = list(set(map(lambda x: x.strip().split(",")[1], data)))
relation_list = list()
src_node_list = []
dst_node_list = []
for one in src_ip_list:
src_node_list.append(Node("host", name = one))
for one in dst_ip_list:
dst_node_list.append(Node("dns_server",name = one))
for one in data:
src_ip, dst_ip = one.split(",")
src_node = src_node_list[src_ip_list.index(src_ip)]
dst_node = dst_node_list[dst_ip_list.index(dst_ip)]
r = Relationship(src_node, "query", dst_node)
#在数据库创建这个东西,注意看这里是两个节点和一个关系一起创建的
s = src_node | dst_node | r
graph.create(s)
代码分析
-
创建节点Node
Node("host", name = one)
,这个代码中,第一个参数是Label的信息,第二个是name。相当于create (host|one)
,这样的语句。虽然两个节点对象都是这种创建方式,但是插入的两种类型,只有一个默认按照name来显示节点,不过可以在界面选择不显示的点,设置让他显示这个名字。不过我暂时还没找到其他的一些关于这个节点属性的插入方式,这个后面解决一下。 -
创建关系
没什么多说的,Relationship(src_node, "realation label", dst_node)
。最后的graph.create(s)节点有点意思,这个意思是批量创建吗?还是说必须是这种存在关系的三个变量。而且这里有一个问题我还是没注意到的,就是实际上某个节点可能已经创建好了,这种情况是怎么处理的,可能要看这个API来解决了。 -
节点的重复性
一开始的时候,我对他这个节点的属性和其他的东西理解的不清楚,以为这些都是唯一的,但是测试过程中发现如果我执行两次同样的插入命令,结果会出现两个节点;这两个节点信息都是一样的, 只有id不一样,可以从界面上看到这个信息。所以,这才产生了前面先去重然后将这个列表存起来的方式。不知道是不是还有别的方式。
网友评论