知難而上,砥礪前行

  • 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,為何?很簡單,想學更多知識,想研究更多,對的,就是想折騰更多,生命不息,折騰不止!我就是喜歡愛折騰,我就喜歡嘗試新的,新的導入方式,新的可視化方法。就這麼簡單,多多嘗試,你會有不一樣的收穫!

如何學習,如何解決問題?當然是Google,百度我不用,Google啥,什麼作為關鍵詞?這些都是很重要的問題,學會搜索,才抓住了根!以這裡的實際問題為例:對於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查詢及點擊節點查看資訊等!

Tags: