---
# System prepended metadata

title: "[12屆 鐵人賽] [Day27]\nNeo4j 綜合應用 & 來讀個 CSV 吧"
tags: [iT鐵人賽, Neo4j]

---

[12屆 鐵人賽] [Day27]
Neo4j 綜合應用 & 來讀個 CSV 吧
=== 

###### tags: `iT鐵人賽` `Neo4j`


## 前情提要

還記得[第 16 篇](https://ithelp.ithome.com.tw/articles/10247202)的時候提過下面這個

![](https://i.imgur.com/UgKJWZA.png)

嗯... 看到標題就知道，沒東西寫了呢，反正剩三篇就讓我能騙就騙吧x

![](https://i.imgur.com/uLGw0Fo.png)

## LOAD CSV

竟然有玩 CSV 首先我們就需要一個 CSV 檔案

就用我之前無聊去打 GTA 5 Online API 抓回來的載具種類資料吧

> [檔案在此](https://github.com/flyxiang1206/NeoTest/blob/main/GTA.csv)

先依照欄位，規劃一下資料吧

| Name | Vehicle__Name | Vehicle__Cost |
| -------- | -------- | -------- |
| Label & Property | Property | Property |

再來直接來寫入資料庫吧

> 記得將檔案丟到資料庫的 `import` 資料夾中才讀的到喔

```javascript
LOAD CSV FROM "file:///GTA.csv" AS map
CALL apoc.create.node([map[0],"Vehicle"], {Name:map[0],VehicleName:map[1],VehicleCost:map[2]}) YIELD node 
RETURN count(*)
```
![](https://i.imgur.com/BkUZToz.png)

首先第一行 `LOAD CSV FROM "file:///GTA.csv" AS map`

為 Cypher 原始的 Load CSV 的指令

再來就是 `CREATE` Node 了

由於計畫是直接將 CSV 的資料直接當 Label 用

所以直接將[第 17 篇](https://ithelp.ithome.com.tw/articles/10247657)提過的 APOC Plugins 叫出來用會比較方便

至於那個 `map[0]` 我不知道為什麼寫 `map.Name` 等會抓不到資料

~~反正這樣寫會過那就這樣吧~~

到這邊 Load CSV 的部分就完成了

再來來便個魔術吧

```javascript
WITH ["Boats","Commercial","Compacts","Coupes","Cycles","Emergency","Helicopters","Industrial","Military","Motorcycles","Muscle","OffRoad","OpenWheel","Planes","Sedans","Service","Sports","SportsClassics","Super","Suvs","Utility","Vans"] AS CName
CREATE (gta:GTA{Name:"GTA"})
FOREACH ( n IN CName | CREATE (gta)-[:Type]->(:VehicleType{Name:n}))
```

```javascript
MATCH (v:Vehicle),(vt:VehicleType)
WHERE v.Name = vt.Name
CREATE (vt)-[:Have]->(v)
```

執行上面兩段語法，你就會獲得這樣的資料結構

GTA -> VehicleType -> Vehicle

![](https://i.imgur.com/TqfwwCe.png)

全部抓出來看是不是看起來很酷呢

![](https://i.imgur.com/6fCq6Yo.png)

---

隨便亂玩了一下資料

稍微模擬了一下大一點的資料庫看起來的樣子

隨然複雜度沒有很高就是了

29 篇的時候再來偷偷放複雜度更高的資料庫吧

下篇 **來講講 Cypher 的 Coding Style 吧**

究竟鐵人賽能不能完賽呢，讓我們繼續看下去

---

## 紀錄

撰寫日期：2020/10/11
耗時： 我懷疑有快 3 小左右 

那些指令有夠難搞
