第十一章 Net 5.0 快速開發框架 YC.Boilerplate --圖資料庫模組Neo4j
線上文件:http://doc.yc-l.com/#/README
線上演示地址:http://yc.yc-l.com/#/login
原始碼github:https://github.com/linbin524/yc.boilerplate
原始碼gitee:https://gitee.com/linxuanming/yc.boilerplate
視訊教程:
元磁之力框架開源初心和框架設計介紹(上): https://www.bilibili.com/video/BV1VM4y1G7hC/
元磁之力框架開源初心和框架設計介紹(下): https://www.bilibili.com/video/BV15h411s7w6/
元磁之力框架資料庫表和程式碼生成使用教程實戰:
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);
}
效果如下: