知難而上,砥礪前行
- 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查詢及點擊節點查看資訊等!
