ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

第十一章 Net 5.0 快速开发框架 YC.Boilerplate --图数据库模块Neo4j

2021-09-17 19:33:59  阅读:207  来源: 互联网

标签:5.0 Name Boilerplate -- UserInfo Key neo4jRepository new Type


在线文档: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);

        }

效果如下:

标签:5.0,Name,Boilerplate,--,UserInfo,Key,neo4jRepository,new,Type
来源: https://www.cnblogs.com/linbin524/p/15305988.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有