iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0
AI & Data

與資料庫共舞系列 第 22

Day 22 — 更動 Neo4j 中的資料

知道怎麼做資料的查詢,我們就要回到怎麼放入資料、建立關聯、更新資料、或是移除資料。

新增資料

今天我們來開一個空白的沙盒。

https://ithelp.ithome.com.tw/upload/images/20200922/20129829zSPWPknX1b.png

我們知道圖資料庫最重要的就是節點。這邊我們來創建兩個節點。你會發現這個語法和查找用的 Match 非常類似,也就是說下面這邊我定義了一個叫做 adam 的節點,他是一個人類類別,並帶有一個特徵叫做姓名,資料值即為 Adam. 同理可證後面的節點。

CREATE (adam:Person { name: 'Adam' }), (bob:Person { name: 'Bob' })

https://ithelp.ithome.com.tw/upload/images/20200922/20129829Nc5L6311ui.png

當然在這個指令後面因為我們有定義兩個節點,也可以直接透過 return adam, bob 來看結果。相對的,如果我們想要讓這兩個節點之間有關連,我們可以先Match 再 Create。這邊我們對應到了兩個名字,並透過 Create 著名我要建立一個 Knows (認識) 的關聯

Match (p1: Person), (p2:Person) 
Where p1.name = 'Adam' AND p2.name = 'Bob' 
Create (p1)-[r:Knows]->(p2)

https://ithelp.ithome.com.tw/upload/images/20200922/201298298FtWTccP7h.png
一樣我們可以透過下面這個簡單的Match 指令看到結果是成功的。

Match (n) Return n

https://ithelp.ithome.com.tw/upload/images/20200922/20129829DO8MKVFDaJ.png

其實我們也可以再創建的時候就把這個關係置入,就如如同其他圖資料庫在做查詢的時候,我們可以直接在中間著名兩個節點的關係。

CREATE (adam:Person { name: 'Chris' }) -[:Knows] -> (bob:Person { name: 'Dave' })

https://ithelp.ithome.com.tw/upload/images/20200922/20129829y46R5oErsJ.png

如果我們有大量的資料要匯入,我們也可以直接透過匯入逗號分隔檔 (CSV) 直接建立我們的圖資料庫。這邊礙於沒有空間可以放置可以示範的 CSV 在網路上供大家下載、我們也沒有在自己的電腦上面建立本機的圖資料庫,我就簡單的利用 Cypher 的官方說明文件使用他的範例檔案來做簡單的介紹。匯入的逗號分割檔格式非常的簡單,每一列是一個節點,每一欄就是一筆資料欄位的值:

如果我們的CSV長這樣:

id,name
1,Charlie Sheen
2,Michael Douglas
3,Martin Sheen
4,Morgan Freeman

我們就可以透過下面這個指令匯入

LOAD CSV WITH HEADERS FROM "file:///persons.csv" AS csvLine
CREATE (p:Person {id: toInteger(csvLine.id), name: csvLine.name})

有沒有註意到這個指令我們一樣是建立一個人的節點,然後我們告訴這個指令,檔案名稱以及編號相對應的欄位。所以相同的我們剛剛在上面建構節點之間的關係也可以透過另外一個csv檔,去定義這個關係。

person1,person2
1,4
4,1
3,2
4,2
3,2
LOAD CSV WITH HEADERS FROM "file:///relations.csv" AS csvLine
MATCH (person:Person {id: toInteger(csvLine.person1}),
			(person2:Person {id: toInteger(csvLine.person2)})
CREATE (person1)-[:Knows]->(person2)

這邊一樣的,我們透過 CSV 相對資料的欄位,做出適當的定義,然後剩下的就跟上面一樣了。

更新節點

常出現的一個狀況是我們不知道這個節點到底是否已經存在圖資料庫中,而且我們又想要對這一個節點做一些資料上的更新,這時候我們就會使用Merge個指令。

MERGE (adam:Person {name:"Adam"})
RETURN adam, adam.name

這邊我們在做的事情是,我們先尋找載圖資料庫中,是否有Adam個人物,如果沒有的話創立 Adam 這一個節點。延續上面的範例的話,我們就知道 Adam 已經存在資料庫中,所以這個接點並不會被建立。那些我們來看看下面這個例子。這個例子就會建立一個新的節點,這是因為在篩選條件之中,我們新增了一個叫做年齡的條件。再資料庫中既然沒有辦法找到一個同時符合這個年齡又符合這個姓名的人的節點,他就會創建一個新的節點。

MERGE (adam:Person {name:"Adam", age:18}) 
RETURN adam, adam.name

那這個時候如果我們要更新到底要怎麼寫這個指令呢?

MERGE (bob:Person {name:"Bob"}) 
ON CREATE SET bob.age = 20
ON MATCH SET bob.age = 20, bob.name="Bob2"

當我們執行上述那個指令的時候,因為在之前的資料庫之中有 Bob 這號人物,所以他會走下面那個途徑: 也就是 On Match 依照找到相匹配的節點做資料更新,也就是執行設定年齡為20,姓名為Bob2。

https://ithelp.ithome.com.tw/upload/images/20200922/20129829sBznc8g29T.png

既然這個時候已經沒有可以符合 Bob 的這號人物,當我們重新再運行同樣的指令,他就會選擇走上面那個途徑,也就是 On Create,來創建節點。當Merge 創建節點時,這個指令就會加入年齡是20的資訊。

https://ithelp.ithome.com.tw/upload/images/20200922/201298297EVD2PJAZq.png

刪除

最後是刪除節點與關係,首先我們來看如何刪除單一沒有任何關係的節點。

MATCH (n:Person { name: 'Bob' }) DELETE n

https://ithelp.ithome.com.tw/upload/images/20200922/20129829S49dFWYXHm.png

接下來如果我們想要刪除但有關係的節點的時候,我們必須要先處理關係再刪除節點。下面這個範例就是在說如果一個節點跟其他節點還有關係,在刪除這個節點的時候資料庫會出現錯誤提醒你這個節點無法被刪除。

MATCH (n:Person { name: 'Bob2' }) DELETE n

https://ithelp.ithome.com.tw/upload/images/20200922/20129829xWpx7i6rxz.png

所以這時候我們在執行刪除的指令前面要加上 Detach 也就是把這個節點相關的關係都先解除。

MATCH (n:Person { name: 'Bob2' }) Detach DELETE n

https://ithelp.ithome.com.tw/upload/images/20200922/20129829AEgBPLu3cM.png

好的, Neo4j 和 Cypher 的介紹就暫時告一個段落,這邊應該也足夠入門了! 名天我們開始最後一節的進階關聯式資料庫。


上一篇
Day 21 — 成為 Cypher 探險家
下一篇
Day 23 — 關聯式資料庫: 從設計講起
系列文
與資料庫共舞30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言