知难而上,砥砺前行

  • 2019 年 10 月 5 日
  • 筆記

Apoc导入及Neo4J数据动态交互可视化


今日知图

异常处理

如果vi异常退出,在磁盘上会保存有交换文件

下次再使用vi编辑该文件时,会看到多了个.swp文件。按字母d可以删除文件!

保存退出

: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相关信息

{      "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

这里完全没有必要手动,在爬取收据的时候,直接分开写入即可,非常简单!

数据如下:

[    {      "startNode": 3026932579,      "properties": {        "endtime": 253392422400000,        "starttime": 1509379200000,        "labels": [          "参股"        ]      },      ...      ...  ]  

2.Apoc导入

节点创建

apoc语法在第一行,后面 的都是cypher语法,这里我通过直接给节点设置一个labels属性,后面对这个节点定义label的时候,直接访问就可以了,然后删除掉这个labels属性,就是一个完美实现!

这里的处理就是卡了我半天的代码,就这里,我自己实现了,这就是代码给我的乐趣~~~

注意:tianyan.json以及后面的数据放在根目录,比如D盘就直接在D盘,不要往某个文件夹下放,访问不到!

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的难点处理!

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  

节点去重

有两个节点是重复的,如下图所示:

原始数据节点:

导入节点:

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  

去掉重复节点,如下图所示:

创建人与公司关系

这里首先我们根据上图,可以知道,首先创建人与公司关系,人指向公司,如下面所实现!

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  

创建公司与公司关系

上面图可以看到,公司之间还有关系,这里创建公司与公司关系!

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项目后,需要做下面配置!

配置urls.py

urlpatterns = [      url(r'^index', views.index_show),  ]  

配置views.py

def index_show(request):      return render(request, "index.html")  

上述两步的意思是,通过访问index直接可以渲染出index.html页面,而这个页面也就是我们最终的可视化Neo4J数据的页面!

5.动态交互可视化

这里可视化使用neovis.js,更多的api使用,查看如下官网!

https://github.com/neo4j-contrib/neovis.js 连接Neo4J

server_url: "bolt://localhost:7687",  server_user: "neo4j",  server_password: "xxx",  

节点可视化

labels: {      "Character": {      "caption": "MATCH (n) RETURN n.name",      }  },  

关系可视化

relationships: {      "INTERACTS": {          "thickness": "weight",          "caption": false      }  },  

页面初始化展示

initial_cypher: "MATCH (n)-[r]->(m) RETURN n,r,m"  

6.可视化展示

支持cypher查询及点击节点查看信息等!