[12屆 鐵人賽] [Day18] APOC Plugins - 一些小小的使用心得與開發經驗 === ###### tags: `iT鐵人賽` `Neo4j` ## 前情提要 邊查資料邊看路權鬥士們在平鎮烤肉 寫文章的效率一個低到不行 (゚∀。) 上一篇簡單的介紹了一下 APOC 今天就來講一下我跟 APOC 的故事 順便介紹一下一個 APOC 的函式 ## 故事時間 第一篇有稍微提過,當初是因為工作的需求才使用 Neo4j 在自學完大部分需要用到的功能後,回頭看看要寫入 Neo4j 的資料 發現要寫入資料庫的難度稍微偏高,主要是因為以下幾點 * 資料離散 * 數據量龐大 * 資料內容會不固定重複 ### 資料離散 首先是資料離散的問題,雖說原始的資料檔勉強可以算是有分類 可是各個在同一個檔案中的資料,不一定會有關係 不同檔案的資料卻可能有關係 導致在資料匯入上產生了不少麻煩 ### 數據量龐大 每個原始檔的資料,少則不到 100 多則 4000 起跳 每寫一筆資料就下一個查詢,資料庫遲早起笑 ### 資料內容會不固定重複 如同剛剛所說原始檔檔案多且資料龐大 有可能 X 檔案跟 Y 檔案有關係 可是 X 檔案內部卻沒有關係的情形 然後這些資料基本值都是 A -> B,這樣的關係 不過這兩個 A 跟 B 可能跟其他組的 A 跟 B 是同一個 AB 所以說為了解決這個問題,最好的方案就是 直接建一堆的 A -> B,再將這些一樣的 AB 合併成一個 就可以完美的解決問題了 在百般尋覓之下,我發現了這個 ## apoc.refactor.mergeNodes() APOC 的 `mergeNodes` 可以將一組不同的 `Node` 合而為一 同時還可以自行調整這些 `Node` 的 `Property` 的合併方法 使用的方法大致上長成這樣,要使用 Cypher 的 `CALL` 函式去呼叫他 ```sql CALL apoc.refactor.mergeNodes(nodes,{properties:"combine", mergeRels:true}) ``` 這邊有兩個參數 ### properties 你可以帶三種參數來決定 `Property` 合併的方法 * discard * 只留下第一筆 `Node` 的資料,其他的 `Node` 的資料都刪除 * overwrite / override * 後面合併進來的 `Node` 資料,會取代掉之前的 * combine * 不管三七二十一,全部留下 他也可以依據 `Property` 個別處理,類似這樣 ```sql CALL apoc.refactor.mergeNodes(nodes, {properties: { name:'discard', age:'overwrite', kids:'combine', `addr.*`: 'overwrite', `.*`: 'discard' }}) ``` ### mergeRels 這個屬性可以決定連結在這些 `Node` 上的關係的合併方式 設定為 `true` 的話就會依照關係的 方向、`type` 來合併 以下是其使用效果 | 使用前 | 使用後 | | -------- | -------- | |  |  | > 這些資料的名稱有點危,所以都被我碼掉了 > 呃...對,我直接拿工作的資料來丟 (゚∀。) > 這個很難塞範例阿w 你可以清楚發現那一坨很散的資料,很成功的匯集起來的 ## 好像該收尾了 APOC 還將 Cypher 的功能也匯集起來變成了相關的函數 像是 apoc.create.node、apoc.create.setLabels... 等 之後如果有用到好用的功能再來介紹吧 |> --- 不是,再不收尾就要來不及了 剛剛還跟一起有再寫鐵人賽的朋友跑去餐酒館喝爆 大家今天的作業都還沒交,就跑去喝酒 雖然沒醉,不過回到家實在有夠晚 好險在出門前有先打一點,不然我看是窗了 下篇 **Neo4j with C# 程式串接實作 part1 - 基本連接** 究竟鐵人賽能不能完賽呢,讓我們繼續看下去 --- ## 參考資料 [Neo4j - APOC merge-nodes](https://neo4j.com/labs/apoc/4.1/graph-updates/graph-refactoring/merge-nodes/) ## 紀錄 撰寫日期:2020/10/02 耗時: 應該在 1.5 小內
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up