---
# System prepended metadata

title: "[12屆 鐵人賽] [Day10]\nCypher 語法簡介 Part1 : 基礎中的基礎 MATCH & RETURN"
tags: [iT鐵人賽, Neo4j]

---

[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 分