---
# System prepended metadata

title: "[12屆 鐵人賽] [Day8]\nNeo4j 結構基礎概念，終於進到比較技術的部份了"
tags: [iT鐵人賽, Neo4j]

---

[12屆 鐵人賽] [Day8]
Neo4j 結構基礎概念，終於進到比較技術的部份了
===

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

## 前情提要

這篇可能會很短

阿不對 接下來幾篇可能都會很短 (ﾟ∀ﾟ)

上一篇在介紹介面內容的時候，有提到了一堆奇怪的名詞

今天這篇將會好好的來介紹一下他們

沒有屁話可以講，直接開始吧 ~

## Neo4j 結構基礎

還記得 第二篇提到的圖形資料庫的核心嗎

* 節點 Node
    * ![](https://i.imgur.com/nXJmudm.png)
* 關係 Relationship
    * ![](https://i.imgur.com/5cMlHAt.png)

那麼他都叫資料庫了，總要有一些可以儲存資料的部分吧

當然有! 這時候就要提到另外兩個一樣重要的元素了

* 標籤 Lable & Type for 
    * Lable for Node
    * Type for Relationship
* 屬性 Property 

押觀念時間

:::info
整個 Neo4j 的基礎，由 Node 跟 Relationship 構成
而 Node 跟 Relationship 都各自包含 Lable 跟 Property
但實際的情況略有不同
:::

## Node & Relationship

先來簡單演藝一下 Node 跟 Relationship 的一些組合吧


| 圖像 | 說明 |
| -------- | -------- |
| ![](https://i.imgur.com/UDu3FRJ.png) | 這是兩個可愛的節點  |
| ![](https://i.imgur.com/dIkswLx.png) | 他們兩個之間突然有了關係 |
| ![](https://i.imgur.com/k2jGuNO.png) | 然而 Node2 其實比較喜歡 Node3 |
| ![](https://i.imgur.com/b73iZuk.png) | 而 Node3 其實對 3P 比較有興趣 |
| ![](https://i.imgur.com/vS8yp7V.png) | 這時 Node3 跟 Node2 突然發現<br/><br/>原來 Node1 可以自攻自受 |
| ![](https://i.imgur.com/qeiAwVx.png) | 於是 Node1 決定攻略自己 <br/><br/> ... ( 完結 ) |

> 感謝 Node1 Node2 Node3 的演出

大家看完這三個 Node 之間的愛情故事之後

有沒有更加了解 Node 跟 Relationship 之間的可能性了呢

:::success
Node 之間的 Relationship 數量是可以一直增加的

但是一條 Relationship 只會有頭尾**兩個** Node

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

> 好險 Node1 自攻自受了呢
:::

##  Lable & Type & Property 

首先先切換到上一篇提過的 "Json 顯示模式"

```json=
// Node
{
  "identity" : 0,
  "labels" : [
    "Person"
  ],
  "properties" : {
    "Name" : "Node 1"
  }
}

// Relationship
{
  "relationship" : {
    "identity" : 0,
    "start" : 0,
    "end" : 1,
    "type" : "Connect",
    "properties" : {}
  }
}
```

* Lable
    * 第 4 行
* Type
    * 第 18 行
* Property 
    * 第 7 行 & 第 19 行


我們分開解釋吧

### Lable

```json=
"labels" : [
  "Person"
]
```

首先 Lable，或是好理解一點，你可以叫他 Tag

看一下 Json 結構，你可以發現他就是一個 `String` 的陣列

換句話說你是可以加非常多的 Label 在一個 Node 上的

### Type

```json=
{
  "relationship" : {
    ...
    "type" : "Connect",
    ...
  }
}
```

Relationship Type 我覺得跟 Node Lable 長得很像

因為在下語法的時候，這兩個的用法基本上是一樣的
> 這部分之後會說明

不過每一條 Relationship 只能有**一個** Type

### Property 

```json=
"properties" : {
    "Name" : "Node 1"
}

// or

"properties" : {
    "Name" : "Node 3",
    "Age" : 17,
    "PlayWith" : [
        "Node 1",
        "Node 2"
    ]
}
```
Property 跟標準 Json 沒什麼兩樣

連在下語法的時候，格式也可以說是一模一樣

不過巢狀結構是不允許的

#### 允許的資料類型

* 數值 `int` or `float`
* 字串 `string`
* 布林值 `bool`
* 日期 `DateTime`
* 空間座標 `The spatial type Point`

相關細節歡迎參考[官方文件](https://neo4j.com/docs/cypher-manual/current/syntax/values/#property-types)

> 插旗時間 |>
> 寫了這篇才知道原來 Neo4j 可以存 **WGS 84**
> ![](https://i.imgur.com/yx1civh.png)
> 所以我們倒數幾篇的時候就來聊聊這個主題吧

---

基礎結構講完了 (ﾟ∀ﾟ)

原本是說可能會比較短

結果還是一樣長呢 (ﾟ∀。)

下一篇要準備進入枯燥乏味的程式時間了

究竟會不會打字打到睡著呢w

明天 ***Neo4j 獨創 Cypher Query Language***

期待明日的降臨吧 Ciao!


## 紀錄

撰寫日期：2020/09/15 晚 & 2020/09/16 <!--~~上班時間~~-->
耗時：至少 2.5 小 

