iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
自我挑戰組

圖形資料庫是什麼,可以吃嗎 - Neo4j系列 第 10

Cypher 語法簡介 Part1 : 基礎中的基礎 MATCH & RETURN

前情提要

啊 開始進入學習心得分享技術教學的部分了

這個部分的內容預計會有 8 篇

畢竟都要細講的就講完整一點 絕對不是要騙篇數

會盡量把好用的、可能的變化型通通帶出來

就是當學習筆記寫啦 (゚∀゚)

文章最後會提供 Demo DataBase 建立的原碼,執行後就會得到一樣的資料庫了

MATCH

首先先回憶一下上一篇的 Node 表示方法 --> ()

假設我們現在要找資料庫裡的所有 Node 那會寫成這樣

MATCH ()

在你取得所有資料後,讓他回傳給你是理所當然的

不過你需要先幫他命個名,讓他知道你要他回傳什麼,我們就叫他 n

MATCH (n)
RETURN n

這樣基本式就完成了,像是這樣 ↓↓↓↓↓

Node

那假設我們來找出所有包含 Label 為 " SQL " 的節點吧

這樣就用用到上一篇提過的表達 Label 的方法

MATCH (n:SQL)
RETURN n

再限制更多的條件吧

來找出 Label 為 " SQL " 且 Property 欄位 " Name " 為 " SQL Server " 的資料吧

MATCH (n:SQL{Name:"SQL Server"})
RETURN n

這樣最基本的表示方式就完成了

後面關於 LabelProperty 的部分就自行運用了

小提示:如果有兩個以上的 Label 可以表示成這樣 --> (:NoSQL:Neo4j)

Relationship

來查一條關係吧,假設我們要查出資料庫的類型

MATCH p=({Name:"資料庫"})-[:Type]-() 
RETURN *

稍微解釋一下 p=RETURN *

  • p=
    • 你可以為你的整個 MATCH 命名,寫法就是 (name)=...,這邊範例為 p
  • RETURN *
    • 你可以回傳你所有有命名的資料,用法就是 RETURN *

      如果你沒命名就不會回傳,例如:下圖
      你可以看到當我只命名有連結到的點時,他就會只回傳連結到的點

      MATCH ({Name:"資料庫"})-[:Type]-(n) RETURN *
      

那有辦法某個限定關係長度的資料嗎

答案是,可以,類似這樣

MATCH p=()-[*..2]-(:File)
RETURN *

這邊使用了 *..2中間關聯數最多 2 條的意思

你可以看到離藍色點最遠不超過兩個關係

同理,如果寫成 *2..4 就是指中間關聯數為 2 到 4 條的意思

當然我們也可以取得與某個 Node 有關係的所有 Node

例:取得跟 " 非關聯式資料庫 " 有關的所有 Node

MATCH p=({Name:"非關聯式資料庫"})--() RETURN *

OPTIONAL MATCH

如果在 MATCH 的時候沒有匹配的資料呢

正常的情況,回什麼都沒回給你,像是這樣

這是原始資料

你可以發現 Neo4j 這個點並沒有任何對外關係

這時候如果搜尋 Neo4j 對外的點,我們會得到這樣

MATCH p=({Name:"Neo4j"})-->() RETURN *

你可以看到 Response 的值是空的

這時如果加上 OPTIONAL,結果會變成這樣

OPTIONAL MATCH p=({Name:"Neo4j"})-->() RETURN *

你可以看到他幫你把回傳值補上 null

是的,OPTIONAL 會自動把空的資料代換成 null

目前本人在實務上還沒遇到需要用到這個關鍵字的時候
如果之後有遇到再跟大家分享 |>


為什麼一個 MATCH 可以講這麼長阿 (((゚Д゚;)))

預計打一個小時的,打了一小時 50 分

不要鬧了,時間要不夠啦 (゚∀。)

已經兩篇沒有 meme 圖啦,好想玩哏喔,這麼會這樣

明天 Cypher 語法簡介 Part2 : 學過 SQL 的你,似曾相似的 WHERE

期待明日的降臨吧 Ciao!


參考資料

Neo4j Cypher Manual

(書) Neo4j 大事典:圖形資料庫&大數據時代

我的原碼

我只會貼一次

Create (db:Name{Name:'資料庫'})
Create (db)-[:Type]->(sql:SQL:Name{Name:'關聯式資料庫'})
Create (db)-[:Type]->(nosql:NoSQL:Name{Name:'非關聯式資料庫'})
Create (sql)-[:have]->(:SQL:Name{Name:'SQL Server'})
Create (sql)-[:have]->(:SQL:Name{Name:'Oracle'})
Create (sql)-[:have]->(:SQL:Name{Name:'My SQL'})
Create (nosql)-[:have]->(key:Key:NoSQL:Name{Name:'鍵值儲存資料庫'})
Create (nosql)-[:have]->(file:File:NoSQL:Name{Name:'文件儲存資料庫'})
Create (nosql)-[:have]->(time:Time:NoSQL:Name{Name:'時序型資料庫'})
Create (nosql)-[:have]->(G:G:NoSQL:Name{Name:'圖形資料庫'})
Create (G)-[:have]->(:Neo4j:G:NoSQL:Name{Name:'Neo4j'})
Create (G)-[:have]->(:G:NoSQL:Name{Name:'JanusGraph'})
Create (file)-[:have]->(:File:NoSQL:Name{Name:'CouchDB'})
Create (file)-[:have]->(:File:NoSQL:Name{Name:'MongoDB'})
Create (key)-[:have]->(:Key:NoSQL:Name{Name:'Redis'})
Create (key)-[:have]->(:Key:NoSQL:Name{Name:'Memcached'})
Create (time)-[:have]->(:Time:NoSQL:Name{Name:'Graphite'})
Create (time)-[:have]->(:Time:NoSQL:Name{Name:'InfluxDB'})

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


上一篇
Neo4j 獨創 Cypher Query Language
下一篇
Cypher 語法簡介 Part2 : 學過 SQL 的你,似曾相似的 WHERE
系列文
圖形資料庫是什麼,可以吃嗎 - Neo4j30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言