Neo4j 学习笔记(一) 初遇篇

简介: Neo4j 学习笔记(一) 初遇篇

为什么要有Neo4J?

各种数据库事实上都是在描述现实世界上中数据之间的联系,现实世界中一个比较典型的场景就是关系数据库力有不逮的地方,那就是社交网络,这种重联系的数据。如下图所示:

image.png

A和B、C、D、E都是好朋友,这在关系型数据库是典型的多对多关系, 对于多对多的关系,一般关系型的策略是建立一张中间表来描述这种多对多的关系。但是在关系型数据库中描述联系更常见的场景是描述不同数据的建模关系,比如学生和课程表的关系,选课表就存储学生ID,课程表ID等其他必要信息,学生和课程描述的对象是不同的,上面的图描述的数据是相同的,可能都是社交圈的人。我们该如何存储这种联系,一张自联系的表?存储跟他联系的信息?像下面这样:

image.png

那如果我现在的需求是查询A的朋友的朋友呢,那一个简单而无脑的操作就是我想看我朋友的朋友,这只是一层, 对应的SQL其实很好写:

# 请原谅我还是从Student还是
 SELECT * FROM Student WHERE id in ( 
 SELECT studentReleationId  FROM student_releation WHERE studentId in     
 (SELECT studentReleationId FROM student_releation WHERE studentId  = '1')
# 转成join的话,先找出我朋友的朋友的Id,然后再做join,或者子查询
SELECT s2.studentReleationId  FROM student_releation s1 INNER JOIN  student_releation s2 on s1.studentReleationId = s2.studentId
WHERE s1.studentId = '1'

但其实并不推荐join,假设一个人的社交好友有100个,有的其实会更高,那我存储个人信息如果只有三万个人的话,那么存储联系的表就是三百万条数据,这个其实还不算交叉认识的。对于关系型数据库来说大表的join是一场灾难,但对于社交软件来说,三万个用户来说是相当少的数据量,对于成熟的社交产品来说,三百万,三千万都有可能。再比如电影关系图,查看某个导演的电影参演的演员,对于关系型数据库来说这个也不是不能做,只是数量上去之后,我们查询速度是不断在下降的,因为对于表与表之间的关系基本靠join,join的越多速度越慢。由此我们就引出了图数据库的应用场景,多对多建模、存取数据。图数据库对关联查询一般都进行针对性优化,比如存储模型上、数据结构、查询算法等,防止局部数据的查询引发全部数据的读取。

关系型数据库有不同的实现,MySQL,Oracle, SQL Server 一样,图数据库也有不同的实现: Neo4j,JanusGraph,HugeGraph。关系型数据库的查询语言是SQL,图数据库的查询语言是: Gremlin、Cypher.本次我们介绍的就是Neo4j。

用起来

我首先还是来到Neo4j官网希望有免费试用的,因为我不想自己装。然后我看到了免费试用:

image.png

然后我就不装了,直接开始用。我们首先还是先介绍基本的语法:

  • 创建
  • 创建结点
CREATE (Person { name: "Emil", from: "Sweden", klout: 99 })

Person是这个结点的标签,{}里面是这个标签的属性。

  • 创建联系
MATCH (ee:Person) WHERE ee.name = "Emil"  #  先查询一次是为了后面建立联系
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }), # 创建一个结点,并将js指向该结点
(ir:Person { name: "Ian", from: "England", title: "author" }),# 创建一个结点,并将ir指向 这个结点
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
# (变量)-[关系描述]->(变量)  这两个结点建立联系 [中是对这个边的关系描述] KNOWS可以理解为了解,KNOWS{SINCE:2001}表示ee和js认识是在2001年
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)

  • 移除结点的属性
MATCH (a:Person {name:'Emil'}) REMOVE a.name
  • 删结点
MATCH (a:Person {name:'Ian'}) DELETE a

MATCH(ee:Person) where name = 'Johan'
SET ee.name = '张三' RETURN ee; 
# 将name = Johan 的name改为张三
MATCH (ee:Person) WHERE ee.name = "Johan" RETURN ee; # 查出结点中name叫Johan的,然后返回
MATCH (n)-[:KNOWS]-() RETURN n
MATCH (a:Person {name:'Ian'})-[r1:KNOWS]-()-[r2:KNOWS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName
# friend_of_a_friend 是返回的变量
  • 查找某人朋友的朋友, 这里我们将KNOWS看做朋友
  • 查找所有具有Knows关系的结点
  • 查找单个结点

Java操纵Neo4J

Java操纵任何数据库都需要驱动, Neo4j的免费试用版有对应的语言示例.

image.png

Neo4J 的驱动跟JDBC类似,原生都是我们拼SQL,然后提交。依赖:

<dependency>
      <groupId>org.neo4j.driver</groupId>
      <artifactId>neo4j-java-driver</artifactId>
      <version>4.1.0</version>
 </dependency>

示例:

public class DriverIntroduction implements AutoCloseable{
    private final Driver driver;
    public DriverIntroduction(String uri, String user, String password, Config config) {
        // The driver is a long living object and should be opened during the start of your application
        driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), config);
    }
    @Override
    public void close() throws Exception {
        driver.close();
    }
    public void createFriendship(final String person1Name, final String person2Name) {
        // 创建结点 然后建立联系,并返回结点
        String createFriendshipQuery = "CREATE (p1:Person { name: $person1_name })\n" +
                "CREATE (p2:Person { name: $person2_name })\n" +
                "CREATE (p1)-[:KNOWS]->(p2)\n" +
                "RETURN p1, p2";
        Map<String, Object> params = new HashMap<>();
        params.put("person1_name", person1Name);
        params.put("person2_name", person2Name);
        try (Session session = driver.session()) {
            Record record = session.writeTransaction(tx -> {
                Result result = tx.run(createFriendshipQuery, params);
                return result.single();
            });
        } catch (Neo4jException ex) {
            throw ex;
        }
    }
}

总结一下

本文简单介绍了一下Neo4J的由来,以及基本的增删改查,Java操纵数据库。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
SQL 存储 人工智能
ISO 专家解读 | 什么是 GQL 国际标准图查询语言
4 月 12 日,图查询标准语言 GQL(Graph Query Language)正式发布。与此同时,悦数图数据库 v5.0 宣布原生支持 GQL。GQL 一经问世,便在图行业内外引起广泛关注, ISO 数据库语言项目召集人 Keith W. Hare 发布了一篇对 GQL 的解读文章。让我们跟随专家的视角,来了解一下什么是 GQL,以及 GQL 数据库语言的功能。
|
运维 监控 Devops
|
小程序 安全 网络协议
Nginx配置小程序域名(HTTPS
Nginx配置小程序域名(HTTPS
Nginx配置小程序域名(HTTPS
|
9月前
|
人工智能 自然语言处理 算法
经典大模型提示词工程技术路线概述
本文概述几种经典提示词工程方法,总结关键信息,分析其优势和局限,并分享笔者的一点思考。
826 105
经典大模型提示词工程技术路线概述
|
10月前
|
API 开发者 Windows
uniapp 极速上手鸿蒙开发
uniapp 自版本 `4.28.2024092502` 起支持鸿蒙应用开发,现版本 `4.36.2024112817` 同时支持鸿蒙应用和元服务开发。本文介绍使用 HBuilderX 4.24+ 和 DevEco Studio 进行环境配置、项目创建及运行的详细步骤,涵盖从 AGC 平台新建项目、配置证书到最终运行项目的全流程,帮助开发者快速上手鸿蒙开发。注意:HBuilderX 4.31+ 构建的鸿蒙运行包不支持 x86_64 平台,需使用真机调试。
998 85
uniapp 极速上手鸿蒙开发
|
6月前
|
运维 安全 数据可视化
日志审查安排工具实战攻略:中小团队如何通过日志审查安排工具建立可控、安全的审查机制?
在审计敏感时代,日志审查安排工具成为安全运维与合规管理的关键利器。它实现审查任务的流程化、周期化与可视化,支持多系统协作、责任到人,确保“可控、可查、可追”的日志治理。工具如板栗看板、Asana、Monday 等提供任务调度、问题闭环与合规对接能力,助力企业构建高效、透明的日志审查体系,提升安全与合规水平。
|
前端开发 Java 应用服务中间件
一文讲明SpringMVC 【爆肝整理一万五千字】
文章提供了一份全面的SpringMVC教程,涵盖了SpringMVC的简介、创建实例、注解、获取请求参数的不同方式、域对象共享数据、视图渲染、RESTful风格、拦截器使用、异常处理以及文件上传下载等内容,并包含了相应的代码示例和测试结果。
一文讲明SpringMVC 【爆肝整理一万五千字】
|
消息中间件 程序员 数据处理
探究操作系统中的进程间通信(IPC)机制及其在现代软件开发中的应用
本文深入探讨了操作系统中的核心概念——进程间通信(IPC),揭示了其在现代软件开发中的关键作用。通过对各种IPC机制如管道、消息队列、共享内存等的详细分析,本文旨在为读者提供一个清晰的理解框架,帮助他们掌握如何在实际应用中有效利用这些技术以实现进程间的协同工作。此外,文章还将探讨IPC在高并发环境下的性能优化策略,以及如何避免常见的IPC编程错误。通过结合理论与实践,本文不仅适合希望深入了解操作系统原理的技术人员阅读,也对那些致力于提升软件质量和开发效率的程序员具有重要参考价值。
413 13
|
JavaScript
Vue引入Echarts图表的使用
Vue引入Echarts图表的使用
356 0
|
消息中间件 开发者 微服务
构建高效代码:模块化设计原则的实践与思考
在软件开发的世界中,编写可维护、可扩展且高效的代码是每个开发者追求的目标。本文将探讨如何通过应用模块化设计原则来提升代码质量,分享一些实践中的经验教训以及对未来技术趋势的思考。

热门文章

最新文章