標題越來越長了,內容卻越來越短了 (゚∀。)
前兩篇稍微介紹了 MATCH
、WHERE
這兩個查詢相關的核心語法
今天要來講講如何創造出自己的資料庫
所以讓我們從 CREATE
開始吧
(:Name{Name:'資料庫'})-[:Type]->(:SQL:Name{Name:'關聯式資料庫'})
相信大家看完前面兩篇的文章,對於上面這段在講什麼一定非常了解了
什麼你說你還看過前面兩篇,母湯,我罰你從第一篇重看
那把他加上 CREATE
看看吧
CREATE p=(:Name{Name:'資料庫'})-[:Type]->(:SQL:Name{Name:'關聯式資料庫'})
RETURN p
跟 MATCH
的概念一模一樣,是不是很簡單呢 (゚∀゚)
再來結合 MATCH
在剛剛的 "資料庫" 再連一條線出去吧
MATCH (n:Name{Name:'資料庫'})
CREATE p=(n)-[:Type]->(:NoSQL:Name{Name:'非關聯式資料庫'})
RETURN p
這樣 "資料庫" 就會同時連到 "關聯式資料庫" 跟 "非關聯式資料庫" 了
不要像我一樣第一次用的時候傻傻的
CREATE p=(:Name{Name:'資料庫'})-[:Type]->(:SQL:Name{Name:'非關聯式資料庫'})
直接把 "資料庫" 的
Node
變兩個
如果你要新增很多比類似的資料,那每次都要打 CREATE
的話會有點麻煩
這時 UNWIND
就可以幫上忙,他可以幫忙一次新增大量的資料
UNWIND [ {Name:"Andy",Position:"Developer"},
{Name:"Michael",Position:"Developer"} ] AS map
CREATE (n:Name{Name:map.Name,Position:map.Position})
RETURN n
範例來自這裡
這樣在新增上就會變得簡單許多
假設你有某一個
Node
不需要 Position 屬性的話,那可以寫成這樣{Name:"Name",Position:NULL}
這樣這個節點就不會有 Position 屬性了
注意
如果寫成這樣{Name:"Name",Position:""}
那你會獲得一個,有 Position 屬性但沒有值
的Node
在上面 CREATE
有提到不小心沒處理好的話,可能會不小心重複新增資料
這時候 MERGE
就會很好用,他會先做比對確定沒有才會新增
假設這是原始的 Node
那麼這時我們用一樣的資料下 MERGE
--> MERGE (n:Weapon{Name:"阿姆斯特朗砲"})
你會發他並沒有重複新增,但是
如果你多加了一些屬性上去
--> MERGE (n:Weapon{Name:"阿姆斯特朗砲",Size:30})
嗯 他多新增了一個點
對於 MERGE
來說所有有訂出來的 Property
都要長的一樣,他才會認為是同一個點
從剛剛的內容可以發現 MERGE
會有兩個狀態
MATCH
CREATE
所以 MERGE
還有提供兩個方法對這兩種狀態做處理
ON MATCH
和 ON CREATE
顧名思義,在兩種中其中一種處發的時候會執行後面的語句
就是 if..else
的概念啦
讓我們逆轉一下,回到資料庫只有一個阿姆斯特朗砲
的時候
我們來世是下面這段
MERGE (n:Weapon{Name:"阿姆斯特朗砲"})
ON MATCH SET n.Size = 30
ON CREATE SET n.Status = "Create"
RETURN n
你會發現原本的阿姆斯特朗砲
多了一個 Size
的 Property
因為原本 MERGE
的資料已經存在
所以他觸發了 ON MATCH
的事件,執行了 SET n.Size = 30
什麼你說
SET
,修改資料啦,下篇講
感覺沒有講得很完整,但基礎架構應該是夠了 (゚∀゚)
不管了,好累,就這樣了,最近實在是太累了
明天 Cypher 語法簡介 Part4 : Set 一下新資料吧
期待明日的降臨吧 Ciao!
排版好看的版本同步更新在我的 HackMD