[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 小左右 那些指令有夠難搞