線上文件: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/

元磁之力框架資料庫表和程式碼生成使用教程實戰: https://www.bilibili.com/video/BV1oM4y137D5/

QQ群:1060819005

後續:關於框架demo和細節技巧,會在QQ群中釋出,就不撰文說明。

圖資料庫模組 Neo4j

基礎介紹

Neo4j是一個高效能的NOSQL圖形資料庫,我們通常在做知識圖譜體系用到該資料庫。YC.Boilerplate 將其引入框架中為後續的資料分析等功能提供助力。

當前模組 YC.Neo4j 建立基礎倉儲程式碼,方便開發呼叫,更為複雜、自定義的業務,請按需拓展。

應用場景:

  • 機器學習
  • 資料分析

對比分析

  1. 更快的資料庫操作。當然,有一個前提條件,那就是資料量較大,在MySql中儲存的話需要許多表,並且表之間聯絡較多(即有不少的操作需要join表)。

  2. 資料更直觀,相應的SQL語句也更好寫(Neo4j使用Cypher語言,與傳統SQL有很大不同)。

  3. 更靈活。不管有什麼新的資料需要儲存,都是一律的節點和邊,只需要考慮節點屬性和邊屬性。而MySql中即意味著新的表,還要考慮和其他表的關係。

  4. 資料庫操作的速度並不會隨著資料庫的增大有明顯的降低。這得益於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); }

效果如下: