[12屆 鐵人賽] [Day10] Cypher 語法簡介 Part1 : 基礎中的基礎 MATCH & RETURN === ###### tags: `iT鐵人賽` `Neo4j` ## 前情提要 啊 開始進入~~學習心得分享~~技術教學的部分了 這個部分的內容預計會有 8 篇 畢竟都要細講的就講完整一點 ~~絕對不是要騙篇數~~ 會盡量把好用的、可能的變化型通通帶出來 就是當學習筆記寫啦 (゚∀゚) > 文章最後會提供 Demo DataBase 建立的原碼,執行後就會得到一樣的資料庫了 ## MATCH 首先先回憶一下上一篇的 `Node` 表示方法 --> `()` 假設我們現在要找資料庫裡的所有 `Node` 那會寫成這樣 ```sql MATCH () ``` 在你取得所有資料後,讓他回傳給你是理所當然的 不過你需要先幫他命個名,讓他知道你要他回傳什麼,我們就叫他 `n` 吧 ```sql MATCH (n) RETURN n ``` 這樣基本式就完成了,像是這樣 ↓↓↓↓↓ ![](https://i.imgur.com/6kQfcHl.png) ### Node 那假設我們來找出所有包含 `Label` 為 " SQL " 的節點吧 這樣就用用到上一篇提過的表達 `Label` 的方法 ```sql MATCH (n:SQL) RETURN n ``` ![](https://i.imgur.com/5DMK8zG.png) 再限制更多的條件吧 來找出 `Label` 為 " SQL " 且 `Property` 欄位 " Name " 為 " SQL Server " 的資料吧 ```sql MATCH (n:SQL{Name:"SQL Server"}) RETURN n ``` ![](https://i.imgur.com/OEOJluH.png) 這樣最基本的表示方式就完成了 後面關於 `Label` 跟 `Property` 的部分就自行運用了 小提示:如果有兩個以上的 `Label` 可以表示成這樣 --> `(:NoSQL:Neo4j)` ### Relationship 來查一條關係吧,假設我們要查出資料庫的類型 ```sql MATCH p=({Name:"資料庫"})-[:Type]-() RETURN * ``` ![](https://i.imgur.com/g8TXMOy.png) 稍微解釋一下 `p=` 跟 `RETURN *` * `p=` * 你可以為你的整個 `MATCH` 命名,寫法就是 `(name)=...`,這邊範例為 **p** * `RETURN *` * 你可以回傳你所有`有命名`的資料,用法就是 `RETURN *` > 如果你沒命名就不會回傳,例如:下圖 > 你可以看到當我只命名有連結到的點時,他就會只回傳連結到的點 > ``` > MATCH ({Name:"資料庫"})-[:Type]-(n) RETURN * > ``` > ![](https://i.imgur.com/f8XV5fw.png) 那有辦法某個限定`關係`長度的資料嗎 答案是,可以,類似這樣 ```sql MATCH p=()-[*..2]-(:File) RETURN * ``` ![](https://i.imgur.com/oqSKHc0.png) 這邊使用了 `*..2` 指**中間關聯數最多 2 條**的意思 你可以看到離藍色點最遠不超過兩個`關係` > 同理,如果寫成 `*2..4` 就是指**中間關聯數為 2 到 4 條**的意思 當然我們也可以取得與某個 `Node` 有關係的所有 `Node` 例:取得跟 " 非關聯式資料庫 " 有關的所有 `Node` ```sql MATCH p=({Name:"非關聯式資料庫"})--() RETURN * ``` ![](https://i.imgur.com/znfcK38.png) ## OPTIONAL MATCH 如果在 `MATCH` 的時候沒有匹配的資料呢 正常的情況,回什麼都沒回給你,像是這樣 這是原始資料 ![](https://i.imgur.com/GFsvPp5.png) 你可以發現 `Neo4j` 這個點並沒有任何對外關係 這時候如果搜尋 `Neo4j` 對外的點,我們會得到這樣 ```sql MATCH p=({Name:"Neo4j"})-->() RETURN * ``` ![](https://i.imgur.com/LhCv8ZX.png) 你可以看到 `Response` 的值是空的 這時如果加上 `OPTIONAL`,結果會變成這樣 ```sql OPTIONAL MATCH p=({Name:"Neo4j"})-->() RETURN * ``` ![](https://i.imgur.com/1gybL9O.png) 你可以看到他幫你把回傳值補上 `null` 了 是的,`OPTIONAL` 會自動把空的資料代換成 `null` > 目前本人在實務上還沒遇到需要用到這個關鍵字的時候 > 如果之後有遇到再跟大家分享 |> --- 為什麼一個 `MATCH` 可以講這麼長阿 (((゚Д゚;))) 預計打一個小時的,打了一小時 50 分 不要鬧了,時間要不夠啦 (゚∀。) 已經兩篇沒有 meme 圖啦,好想玩哏喔,這麼會這樣 明天 ***Cypher 語法簡介 Part2 : 學過 SQL 的你,似曾相似的 WHERE*** 期待明日的降臨吧 Ciao! --- ## 參考資料 [Neo4j Cypher Manual](https://neo4j.com/docs/cypher-manual/current/) (書) [Neo4j 大事典:圖形資料庫&大數據時代](https://www.books.com.tw/products/0010813100) ## 我的原碼 我只會貼一次 ```sql 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'}) ``` ## 紀錄 撰寫日期:2020/09/20 耗時:至少 1 小 50 分