第十一章 Net 5.0 快速開發框架 YC.Boilerplate –圖數據庫模塊Neo4j
- 2021 年 9 月 17 日
- 筆記
- .NET, YC.Boilerplate
在線文檔://doc.yc-l.com/#/README
在線演示地址://yc.yc-l.com/#/login
源碼github://github.com/linbin524/yc.boilerplate
源碼gitee://gitee.com/linxuanming/yc.boilerplate
視頻教程:
元磁之力框架開源初心和框架設計介紹(上): //www.bilibili.com/video/BV1VM4y1G7hC/
元磁之力框架開源初心和框架設計介紹(下): //www.bilibili.com/video/BV15h411s7w6/
元磁之力框架數據庫表和代碼生成使用教程實戰: //www.bilibili.com/video/BV1oM4y137D5/
QQ群:1060819005
後續:關於框架demo和細節技巧,會在QQ群中發佈,就不撰文說明。
圖數據庫模塊 Neo4j
基礎介紹
Neo4j是一個高性能的NOSQL圖形數據庫,我們通常在做知識圖譜體系用到該數據庫。YC.Boilerplate 將其引入框架中為後續的數據分析等功能提供助力。
當前模塊 YC.Neo4j
創建基礎倉儲代碼,方便開發調用,更為複雜、自定義的業務,請按需拓展。
應用場景:
- 機器學習
- 數據分析
對比分析
-
更快的數據庫操作。當然,有一個前提條件,那就是數據量較大,在MySql中存儲的話需要許多表,並且表之間聯繫較多(即有不少的操作需要join表)。
-
數據更直觀,相應的SQL語句也更好寫(Neo4j使用Cypher語言,與傳統SQL有很大不同)。
-
更靈活。不管有什麼新的數據需要存儲,都是一律的節點和邊,只需要考慮節點屬性和邊屬性。而MySql中即意味着新的表,還要考慮和其他表的關係。
-
數據庫操作的速度並不會隨着數據庫的增大有明顯的降低。這得益於Neo4j特殊的數據存儲結構和專門優化的圖算法。
開發示例
場景說明
現有一組用戶數據UserInfo,一組公司數據Company,現在想通過技術手段使用兩組數據組合,類似企查查效果,通過查找某個人,查出它關聯的公司信息。
初始化 上述場景測試數據
public Neo4jServiceUnitTest()
{
neo4jRepository = new Neo4jRepository("testdb");
userList = new List<UserInfo>();
userList.Add(new UserInfo() { Key = Guid.NewGuid().ToString(), Name = "張三", Sex = "男", Type = "普通用戶" });
userList.Add(new UserInfo() { Key = Guid.NewGuid().ToString(), Name = "里斯", Sex = "男", Type = "高級用戶" });
userList.Add(new UserInfo() { Key = Guid.NewGuid().ToString(), Name = "王五", Sex = "男", Type = "普通用戶" });
userList.Add(new UserInfo() { Key = Guid.NewGuid().ToString(), Name = "張小玉", Sex = "女", Type = "高級用戶" });
companyList = new List<Company>();
companyList.Add(new Company() { Key = Guid.NewGuid().ToString(), CompanyName = "萬度科技", CEO = "張三", Supervisor = "張小玉", Type = "科技" });
companyList.Add(new Company() { Key = Guid.NewGuid().ToString(), CompanyName = "簽谷科技", CEO = "王五", Supervisor = "張小玉", Type = "科技" });
companyList.Add(new Company() { Key = Guid.NewGuid().ToString(), CompanyName = "東方娛樂", CEO = "張小玉", Supervisor = "張小小", Type = "娛樂" });
companyList.Add(new Company() { Key = Guid.NewGuid().ToString(), CompanyName = "傑飛實業", CEO = "里斯", Supervisor = "張小小", Type = "實業" });
}
效果如下:
創建公司和用戶 聯繫【CEO是某個用戶】
/// <summary>
/// 創建 掌控 關聯數據關聯
/// </summary>
/// <returns></returns>
[Fact]
public async Task MatchRelationControlTest()
{
string condition = $"{neo4jRepository.LeftKey}.Name={neo4jRepository.RightKey}.CEO";
var result = await neo4jRepository.MatchNodeByProperty("UserInfo", "Company", "掌權", $"{neo4jRepository.LeftKey}.Name", condition);
Assert.True(result.Counters.ContainsUpdates);
}
效果如下:
創建公司和其他用戶關係【監事是其他用戶】
/// <summary>
/// 創建 公司關聯 關聯數據關聯
/// </summary>
/// <returns></returns>
[Fact]
public async Task MatchRelationLinkTest()
{
string condition = $"{neo4jRepository.LeftKey}.Name={neo4jRepository.RightKey}.Supervisor";
var result = await neo4jRepository.MatchNodeByProperty("UserInfo", "Company", "公司關聯", $"{neo4jRepository.LeftKey}.Name", condition);
Assert.True(result.Counters.ContainsUpdates);
}
效果如下:
修改某個用戶信息
/// <summary>
/// 更新節點信息
/// </summary>
/// <returns></returns>
[Fact]
public async Task UpateNodeTest()
{
string condtion = "Name:'里斯'";
string setStr = $"{neo4jRepository.Key}.Name='里斯李',{neo4jRepository.Key}.Type='VIP用戶'";
var result = await neo4jRepository.UpdateNode("UserInfo", condtion, setStr);
Assert.True(result.Counters.ContainsUpdates);
Assert.Equal(2, result.Counters.PropertiesSet);
}
效果如下:
查找某個人關聯公司
/// <summary>
/// 通過連接關係 查詢指定節點信息
/// </summary>
/// <returns></returns>
[Fact]
public async Task SelectNodeByRelationShipTest()
{
string relationShipName = "公司關聯";
string condition = "UserInfo.Name='張小玉'";
var tupleList = await neo4jRepository.SelectNodeByRelationShoip<UserInfo,Company>("UserInfo", "Company",relationShipName, condition);
Assert.True(tupleList.Item1.Count>0);
Assert.True(tupleList.Item2.Count>0);
}
效果如下: