Apoc导入及Neo4J数据动态交互可视化
【今日知图】
异常处理
如果vi异常退出,在磁盘上会保存有交换文件
下次再使用vi编辑该文件时,会看到多了个.swp文件。按字母d
可以删除文件!
保存退出
代码语言:javascript复制:x 保存并退出
0.说在前面1.数据处理2.Apoc导入3.Neo4J导入展示4.Web开发5.动态交互可视化6.可视化展示7.作者的话
0.说在前面
【回顾】
之前发过一篇天眼反爬虫文章,如果认真看了的,会发现我研究的知识图谱与这个爬虫很相关,所以我本片文章将利用天眼数据来进行图数据库存储,及可视化!
关于下面所涉及的知识点,基本上以前没有学过,那么如何高效的学习以及实现呢,理论or实战?
【难点】
第一:这次的存储不是普通的存储方式,也不是用代码来实现导入,而是使用Apoc来进行导入,从0开始入坑Apoc;
第二:cypher语法学习,从0入坑;
第二:这次的可视化不是之前学到的d3.js 而是 neovis.js,从0入坑;
【吐槽】
关于Apoc的难点,由于之前从来没学过,一脸懵逼,在我处理过程中,发现之前的cypher语法基本忘完!在使用Apoc使用的时候卡在一个地方,卡了一下,我仍然没有放弃,卡了一下午与一晚上,直到最后关门了才回去,回去后问大佬,就被顶了回来,真的气炸了,人与人的交流就这么难?
我就不信了,做不出来,就这样,昨日下午,重拾心中的那颗地雷,重新开始搞,然后成功了,怎么成功的呢,后面详细介绍。
【学习方法】
这次apoc及可视化成功关键是什么,自己反思了一下,成功之处在于:换角度思考,这里说的换角度以实际例子来说明,首次接触apoc,一直想着通过foreach的语法去循环遍历json的key与value,直接取出来,设置label,可是在neo4j中,label是字符串去掉双引号,我就死循环在这里了,如何将一个字符串去掉双引号,前日问了大佬,直接给我说,你去写个函数,这能写函数?我想说。。可以写吗?后来查验,不能写,也不会写,我就放弃了这个思路,换个角度,从设置属性在删掉属性,取属性来解决,终于搞定了,虽然思路绕了点,但是我成功了。这就是换角度思考的作用,从一个小问题卡死半天,到几分钟就可以解决。
这里可视化并没有按照我所学的d3,为何?很简单,想学更多知识,想研究更多,对的,就是想折腾更多,生命不息,折腾不止!我就是喜欢爱折腾,我就喜欢尝试新的,新的导入方式,新的可视化方法。就这么简单,多多尝试,你会有不一样的收获!
如何学习,如何解决问题?当然是谷歌,百度我不用,谷歌啥,什么作为关键词?这些都是很重要的问题,学会搜索,才抓住了根!以这里的实际问题为例:对于apoc,我解决是直接看api解决的,真的英文api比中文api好太多,你不得不信,虽然英文很伤,但还是要看!
其次,我极力推荐的一个工具就是,,,GitHub,我用它解决了我的可视化问题,就这么简单!怎么搜索,直接搜neo,js,就可以了,为什么这么搜索?neo4j是数据库,js是可视化技术,不管是d3还是这里的vis都是js扩展,这么宽的搜索,必然会有很多内容呈现。
当更多显现于你的眼前,你需要做的就是筛选,如何筛选?那就是精确化搜索!
以上就是我忙碌的一日左右的收获,现在分享给各位,欢迎各位留言交流!
下面来实战一下我的研究!
1.数据处理
这里主要介绍数据处理,分为总数据,节点数据与边数据!
总数据:tianyan.json
看到如下数据为nodes与relationships相关信息
代码语言:javascript复制{
"nodes": [
{
"id": 3026932579,
"labels": [
"Company"
],
"properties": {
"name": "四川笃行致信科技有限公司"
}
},
...
...
],
"relationships": [
{
"startNode": 3026932579,
"properties": {
"endtime": 253392422400000,
"starttime": 1509379200000,
"labels": [
"参股"
]
},
"type": "INVEST_C",
"endNode": 143448035
},
...
...
]
}
提取关系:rel.json
为了后续处理方便,直接将relationships后面的所有数据放在另外一个单独文件:rel.json
这里完全没有必要手动,在爬取收据的时候,直接分开写入即可,非常简单!
数据如下:
代码语言:javascript复制[
{
"startNode": 3026932579,
"properties": {
"endtime": 253392422400000,
"starttime": 1509379200000,
"labels": [
"参股"
]
},
...
...
]
2.Apoc导入
节点创建
apoc语法在第一行,后面 的都是cypher语法,这里我通过直接给节点设置一个labels属性,后面对这个节点定义label的时候,直接访问就可以了,然后删除掉这个labels属性,就是一个完美实现!
这里的处理就是卡了我半天的代码,就这里,我自己实现了,这就是代码给我的乐趣~~~
注意:tianyan.json以及后面的数据放在根目录,比如D盘就直接在D盘,不要往某个文件夹下放,访问不到!
代码语言:javascript复制call apoc.load.json("file:///tianyan.json") yield value
FOREACH (each in value.nodes|
create (n)
set n.name=each["properties"]["name"]
set n.id=each["id"]
set n.labels=each["labels"][0]
)
设置节点label
这里就是上面节点创建后,为节点设置label的难点处理!
代码语言:javascript复制MATCH (n)
call apoc.load.json("file:///tianyan.json") yield value
CALL apoc.create.addLabels( id(n), [ n.labels ] ) YIELD node
remove n.labels
return node
节点去重
有两个节点是重复的,如下图所示:
原始数据节点:
导入节点:
代码语言:javascript复制MATCH (n:Company)
WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count
WHERE count > 1
CALL apoc.refactor.mergeNodes(nodelist) YIELD node
RETURN node
去掉重复节点,如下图所示:
创建人与公司关系
这里首先我们根据上图,可以知道,首先创建人与公司关系,人指向公司,如下面所实现!
代码语言:javascript复制call apoc.load.json("file:///rel.json") yield value
match (a:Human {id:value.startNode})
match (b:Company {id:value.endNode})
call apoc.create.relationship(a,value.properties.labels[0],{},b) yield rel
return rel
创建公司与公司关系
上面图可以看到,公司之间还有关系,这里创建公司与公司关系!
代码语言:javascript复制call apoc.load.json("file:///rel.json") yield value
match (a:Company {id:value.startNode})
match (b:Company {id:value.endNode})
call apoc.create.relationship(a,value.properties.labels[0],{},b) yield rel
return rel
3.Neo4J导入展示
最后成功导入后,如下两图对比:
我们将其与天眼官网的图对比,一模一样~~,成功!!!
4.Web开发
这里使用Python web的Django框架进行搭建Web服务!
利用Pytcharm一键创建Django项目后,需要做下面配置!
代码语言:javascript复制配置urls.py
urlpatterns = [
url(r'^index', views.index_show),
]
代码语言:javascript复制配置views.py
def index_show(request):
return render(request, "index.html")
上述两步的意思是,通过访问index直接可以渲染出index.html页面,而这个页面也就是我们最终的可视化Neo4J数据的页面!
5.动态交互可视化
这里可视化使用neovis.js,更多的api使用,查看如下官网!
代码语言:javascript复制https://github.com/neo4j-contrib/neovis.js 连接Neo4J
server_url: "bolt://localhost:7687",
server_user: "neo4j",
server_password: "xxx",
代码语言:javascript复制节点可视化
labels: {
"Character": {
"caption": "MATCH (n) RETURN n.name",
}
},
代码语言:javascript复制关系可视化
relationships: {
"INTERACTS": {
"thickness": "weight",
"caption": false
}
},
代码语言:javascript复制页面初始化展示
initial_cypher: "MATCH (n)-[r]->(m) RETURN n,r,m"
6.可视化展示
支持cypher查询及点击节点查看信息等!