iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0

前情提要

邊查資料邊看路權鬥士們在平鎮烤肉

寫文章的效率一個低到不行 (゚∀。)

上一篇簡單的介紹了一下 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 合而為一

同時還可以自行調整這些 NodeProperty 的合併方法

使用的方法大致上長成這樣,要使用 Cypher 的 CALL 函式去呼叫他

CALL apoc.refactor.mergeNodes(nodes,{properties:"combine", mergeRels:true})

這邊有兩個參數

properties

你可以帶三種參數來決定 Property 合併的方法

  • discard
    • 只留下第一筆 Node 的資料,其他的 Node 的資料都刪除
  • overwrite / override
    • 後面合併進來的 Node 資料,會取代掉之前的
  • combine
    • 不管三七二十一,全部留下

他也可以依據 Property 個別處理,類似這樣

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


排版好看的版本同步更新在我的 HackMD


上一篇
Neo4j Plugins - 強大的 APOC & GDS
下一篇
Neo4j with C# 程式串接實作 part1 - 基本連接
系列文
圖形資料庫是什麼,可以吃嗎 - Neo4j30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言