1. 程式人生 > 其它 >第十一章 Net 5.0 快速開發框架 YC.Boilerplate --圖資料庫模組Neo4j

第十一章 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/
元磁之力框架資料庫表和程式碼生成使用教程實戰:

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);

        }

效果如下:

筆者原創!如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!歡迎各位轉載,轉載請新增原部落格連線,否則保留追究法律責任的權利,謝謝! YC.Boilerplate 快速開發框架交流,請加群:1060819005 區塊鏈交流請加QQ群:538327407(已滿),群2:135019400. 我的部落格地址:http://www.cnblogs.com/linbin524/