---
# System prepended metadata

title: "[12屆 鐵人賽] [Day22]\nNeo4j with C# 程式串接實作 part4 - Neo4jClient 另一個 C# 接 Neo4j 的方法"
tags: [iT鐵人賽, Neo4j]

---

[12屆 鐵人賽] [Day22]
Neo4j with C# 程式串接實作 part4 - Neo4jClient 另一個 C# 接 Neo4j 的方法
===

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


## 前情提要

今天應該不會再作弊了吧

就決定寫短一點了

前三篇講了如何用官方提供的 `Neo4j.Driver` 

完成與 Neo4j 的連接與資料傳遞

今天要來講講另一個與 Neo4j 連接的套件

同時在 NuGet 上，下載數還比 `Neo4j.Driver` 多的套件

也就是 **[Neo4jClient](https://github.com/DotNet4Neo4j/Neo4jClient)**


> 內容警告: 
>
> 本篇文章內容，小弟我之前沒用過，是邊寫文章邊研究的
> 所以說如果寫得很像筆記，或是哪裡怪怪的，請多包含

## Neo4jClient

好的一樣先從基本的連線開始吧

Code 如下，記得要先去 NuGet 裝 `Neo4jClient`

```csharp
var client = new GraphClient(new Uri("http://localhost:7474"), "neo4j", "123456");

await client.ConnectAsync();

var node = await client.Cypher
                       .Match("(n:SQL)")
                       .Return(n => n.As<Sql>())
                       .ResultsAsync;

var nodeList = node.ToList();

```

首先前兩行就是基本連線，應該不用多說

最主要在第三行開始

```csharp
var node = await client.Cypher
                       .Match("(n:SQL)")
                       .Return(n => n.As<Sql>())
                       .ResultsAsync;
```

有玩過 LINQ 的朋友，對於這個結構一定不陌生

`Neo4jClient` 最屌的就是他將 Cypher 用跟 LINQ 類似的方式呈現

> 至少我目前看起來是這樣覺得

```csharp
string sql = $"MATCH (n:SQL) RETURN n";
```

前幾篇還在用 `string` 寫 Cypher

`Neo4jClient` 直接提供了看起來比較科學的玩法

用法實際上跟寫 Cypher 的順序一樣

更多的相關用法可以[參考這裡](https://github.com/DotNet4Neo4j/Neo4jClient/wiki/cypher-examples)，這邊就不多做贅述

再來是這個部分

```csharp
.Return(n => n.As<Sql>())
```

這邊根據大家的直覺，以及前幾篇的內容

直接想到是轉換格式應該是沒有問題的

```csharp
public class Sql
{
    [JsonProperty(PropertyName = "Name")]
    public string Name { get; set; }
}
```

這邊我的 `class Sql` 寫成這樣

```csharp
[JsonProperty(PropertyName = "Name")]
```

其中這個 `Attribute` 是用來 mapping `Property` 用的

如果你變數宣告的名稱跟你的 `Property` 一樣

那這行 `Attribute` 可以不用加，建議還是都加啦

### 一些與 `Neo4j.Driver` 的差異

在資料查詢上看起來確實是方便許多

畢竟用 `string` 寫 Cypher 真的有點刺激

不過，話雖然是這麼說

但我查到現在還是沒找到可以回傳完整 `Node` 或 `Relationship` 資料的方法

> 其實也才查了 2 小時

目前看到的 `Label`、`Property` 一定要分開來讀

這部份對於我來說有那麼點不方便

如果之後有查到方法再來補充吧 |>

另外，寫入資料官網的語法長成這樣

```csharp
var newUser = new User { Id = 456, Name = "Jim" };
graphClient.Cypher
    .Create("(user:User {newUser})")
    .WithParam("newUser", newUser)
    .ExecuteWithoutResults();
```

可是我怎麼測都測不過，莫名其妙

---

漂亮，今天看起來是不用作弊了

原本 `Neo4j.Driver` 是預計要寫 4 篇的

可是發現篇幅好像不太夠，才硬塞了這篇進來

計畫果然充滿變化呢

不過按照計畫，最後還有 4 篇沒東西寫，有點危險ww

下篇 **Neo4j 與 前端技術**

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

---

## My Source Code

[Github Link](https://github.com/flyxiang1206/NeoTest)

## 參考資料

[Neo4j - Using Neo4j from .NET](https://neo4j.com/developer/dotnet/)

[Neo4jClient wiki](https://github.com/DotNet4Neo4j/Neo4jClient/wiki)

## 紀錄

撰寫日期：2020/10/06
耗時： 2 小