Neo4j 学习笔记(一) 初遇篇

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 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
相关文章
|
1月前
|
关系型数据库 MySQL 数据库
MySQL必知必会:第一到第十章《精华合集》
MySQL必知必会:第一到第十章《精华合集》
|
7月前
|
运维 NoSQL MongoDB
[慕课笔记]mongodb入门篇
[慕课笔记]mongodb入门篇
44 1
|
1月前
|
数据采集 存储 JSON
Python网络爬虫基础教程
Python网络爬虫基础教程
|
11月前
|
SQL Oracle Java
JDBC 拾枝杂谈—入门篇(通俗易懂)
JDBC 第一节 拾枝杂谈 带你快速入门!
122 0
|
NoSQL 数据可视化 Java
我的Neo4j探索之旅 - 初识Neo4j(一)
neo4j 这个东西在国内用的很少,目前能百度的资料也是很早之前的几篇了,我针对neo4j 3.5 的版本进行一次学习和记录,以及实际的工作需求我也遇到了,后续会开源一个剔除业务的开源项目,有兴趣的读者可以了解一下图数据库的中间件,还是蛮有意思的。
259 0
|
SQL 自然语言处理 Oracle
史上最详细的JDBC入门教程(初学者必看)
JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,本文中的代码都是针对MySQL数据库实现的。
991 0
史上最详细的JDBC入门教程(初学者必看)
|
存储 SQL NoSQL
MongoDB从基础到实战的学习之路(万字总结值得一看)
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
239 0
MongoDB从基础到实战的学习之路(万字总结值得一看)
|
存储 SQL 人工智能
Neo4j入门实战,以三国英雄关系为例入门Neo4j知识图谱
Neo4j入门实战,以三国英雄关系为例入门Neo4j知识图谱
1098 0
Neo4j入门实战,以三国英雄关系为例入门Neo4j知识图谱
|
机器学习/深度学习 人工智能 算法
数据结构第一周笔记——基本概念(慕课浙大版本--XiaoYu)下
初步学习的困难不会打到你,一遍不行就两边,两边不行就三遍,总会明白的!
90 0
|
存储 机器学习/深度学习 人工智能
数据结构第一周笔记——基本概念(慕课浙大版本--XiaoYu)上
梦的延续,这是来自中国大学慕课——浙江大学陈越老师的数据结构课程文章笔记 内容过多,将进行拆分,由上中下进行分别
104 0