---
# System prepended metadata

title: "[12屆 鐵人賽] [Day18]\nAPOC Plugins - 一些小小的使用心得與開發經驗"
tags: [iT鐵人賽, Neo4j]

---

[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` 來合併

以下是其使用效果

| 使用前 | 使用後 | 
| -------- | -------- | 
| ![](https://i.imgur.com/p8BMTYd.png) | ![](https://i.imgur.com/CprdHq3.png) | 

> 這些資料的名稱有點危，所以都被我碼掉了
> 呃...對，我直接拿工作的資料來丟 (ﾟ∀。)
> 這個很難塞範例阿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 小內