邊查資料邊看路權鬥士們在平鎮烤肉
寫文章的效率一個低到不行 (゚∀。)
上一篇簡單的介紹了一下 APOC
今天就來講一下我跟 APOC 的故事
順便介紹一下一個 APOC 的函式
第一篇有稍微提過,當初是因為工作的需求才使用 Neo4j
在自學完大部分需要用到的功能後,回頭看看要寫入 Neo4j 的資料
發現要寫入資料庫的難度稍微偏高,主要是因為以下幾點
首先是資料離散的問題,雖說原始的資料檔勉強可以算是有分類
可是各個在同一個檔案中的資料,不一定會有關係
不同檔案的資料卻可能有關係
導致在資料匯入上產生了不少麻煩
每個原始檔的資料,少則不到 100 多則 4000 起跳
每寫一筆資料就下一個查詢,資料庫遲早起笑
如同剛剛所說原始檔檔案多且資料龐大
有可能 X 檔案跟 Y 檔案有關係
可是 X 檔案內部卻沒有關係的情形
然後這些資料基本值都是 A -> B,這樣的關係
不過這兩個 A 跟 B 可能跟其他組的 A 跟 B 是同一個 AB
所以說為了解決這個問題,最好的方案就是
直接建一堆的 A -> B,再將這些一樣的 AB 合併成一個
就可以完美的解決問題了
在百般尋覓之下,我發現了這個
APOC 的 mergeNodes
可以將一組不同的 Node
合而為一
同時還可以自行調整這些 Node
的 Property
的合併方法
使用的方法大致上長成這樣,要使用 Cypher 的 CALL
函式去呼叫他
CALL apoc.refactor.mergeNodes(nodes,{properties:"combine", mergeRels:true})
這邊有兩個參數
你可以帶三種參數來決定 Property
合併的方法
Node
的資料,其他的 Node
的資料都刪除Node
資料,會取代掉之前的他也可以依據 Property
個別處理,類似這樣
CALL apoc.refactor.mergeNodes(nodes, {properties: {
name:'discard',
age:'overwrite',
kids:'combine',
`addr.*`: 'overwrite',
`.*`: 'discard'
}})
這個屬性可以決定連結在這些 Node
上的關係的合併方式
設定為 true
的話就會依照關係的 方向、type
來合併
以下是其使用效果
使用前 | 使用後 |
---|---|
這些資料的名稱有點危,所以都被我碼掉了
呃...對,我直接拿工作的資料來丟 (゚∀。)
這個很難塞範例阿w
你可以清楚發現那一坨很散的資料,很成功的匯集起來的
APOC 還將 Cypher 的功能也匯集起來變成了相關的函數
像是 apoc.create.node、apoc.create.setLabels... 等
之後如果有用到好用的功能再來介紹吧 |>
不是,再不收尾就要來不及了
剛剛還跟一起有再寫鐵人賽的朋友跑去餐酒館喝爆
大家今天的作業都還沒交,就跑去喝酒
雖然沒醉,不過回到家實在有夠晚
好險在出門前有先打一點,不然我看是窗了
下篇 Neo4j with C# 程式串接實作 part1 - 基本連接
究竟鐵人賽能不能完賽呢,讓我們繼續看下去
排版好看的版本同步更新在我的 HackMD