iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
自我挑戰組

圖形資料庫是什麼,可以吃嗎 - Neo4j系列 第 20

Neo4j with C# 程式串接實作 part2 - 更多的資料讀寫實作

  • 分享至 

  • twitterImage
  •  

前情提要

今天搭高鐵,有個妹子在車廂內打翻飲料

飲料還流的整個車廂都是,百香果的味道香到不行

上一篇簡單的示範了 C# 接 Neo4j 的基本連線與測試

今天來細講一下 IDriver 底下 AsyncSession() 回傳的 IAsyncSession 的功能吧

WriteTransactionAsync()

上一篇有過這個 Function

string sql = $"CREATE (n:Greeting{{message:'{message}'}}) RETURN n.message + ' from node : '+ id(n)";

var greeting = await session.WriteTransactionAsync(async tx =>
{
    var result = await tx.RunAsync(sql);
    return await result.ToListAsync(r => r[0].As<string>());
});

這邊就實際上的內容很簡單

就是在 Write 模式下開啟一段交談,再回傳資料而已

Write 模式下就包含修改刪除等都可以使用,廢話

值得一提的是 WriteTransactionAsync 會自動 Commit 你的修改內容

相關細節等等在 BeginTransactionAsync 會講到

關於這個部分 result.ToListAsync(r => r[0].As<string>())
屬於回傳資料的內容,下一篇會詳細講

ReadTransactionAsync()

先下一個基本的內容,跟 WriteTransactionAsync 大同小異就是了

string sql = $"MATCH (n:Greeting{{message:'{message}'}}) RETURN n.message + ' from node : '+ id(n)";

var greeting = await session.ReadTransactionAsync(async tx =>
{
    var result = await tx.RunAsync(sql);

    return await result.ToListAsync(r => r[0].As<string>());
});

跟剛剛的 WriteTransactionAsync 為一的不同是

這邊使用的是 Read 模式

在這個模式下 CREATESETDELETE 等功能都是不會工作的

如果你下了這類的語法,在 Neo4j Server 執行的時候會直接擋住

然後回傳錯誤

如果你想要抓到錯誤的話,你可以嘗試調用 result.FetchAsync()

你就會抓到底下這行錯誤

Writing in read access mode not allowed. Attempted write to internal graph 0 (neo4j)

BeginTransactionAsync()

這邊這個就稍微複雜一點了

string sql = $"CREATE (n:Greeting{{message:'{message}'}}) RETURN n.message + ' from node : '+ id(n)";

//建立交談
var session = _driver.AsyncSession();

//開始交談
var transaction = await session.BeginTransactionAsync();

//執行 cypher 語法
var echo = await transaction.RunAsync(sql);

//取得回傳
var result = await echo.ToListAsync(r => r[0].As<string>());

//提交變更
await transaction.CommitAsync();

await session.CloseAsync();

跟之前不一樣的地方是,多這行

await transaction.CommitAsync();

對於 BeginTransactionAsync 來說,所有的操作的是假的

概念跟 Git 有點像,在你沒 Commit 之前,你的變更跟沒變跟一樣

所以說用 BeginTransactionAsync

你可以在不動到 DB 資料的情況下,取得調整後的內容

只要你沒下 CommitAsync(),你怎麼改都不會實際動到資料庫

另外補充

上一篇忘記提到

var session = _driver.AsyncSession();

await session.CloseAsync();

建立 session 之後,要把這個 session 關了,完成一個完整流程


一個作弊

為什麼感覺這篇有點水阿 @@

明天要早點開始寫

最近越來越不會估每篇文的完成所需時間了

有夠母湯

看著這個,總覺得有點心虛呢w

下篇 Neo4j with C# 程式串接實作 part3 - 回傳資料解析

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


My Source Code

Github Link

參考資料

Neo4j - Using Neo4j from .NET

Neo4j.Driver Doc


排版好看的版本同步更新在我的 HackMD


上一篇
Neo4j with C# 程式串接實作 part1 - 基本連接
下一篇
Neo4j with C# 程式串接實作 part3 - 回傳資料解析
系列文
圖形資料庫是什麼,可以吃嗎 - Neo4j30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言