知识图谱入门——5:Neo4j Desktop安装和使用手册(小白向:Cypher 查询语言:逐步教程!Neo4j 优缺点分析)
Neo4j简介
Neo4j 是一个基于图结构的 NoSQL 数据库,专门用于存储、查询和管理图形数据。它的核心思想是使用节点、关系和属性来描述数据。图数据库非常适合那些需要处理复杂关系的数据集,如社交网络、推荐系统、知识图谱等领域。
与传统的关系型数据库相比,Neo4j 不仅在查询速度上占有优势,而且可以直观地展示数据之间的复杂关系。
Neo4j 官网下载地址:Neo4j Developer Tools
如果下载较慢,安装包我已经上传到我的资源里
Neo4j安装步骤
1. 安装步骤
安装教程较多,我推荐一篇:
【知识图谱】neo4j桌面版安装与配置(2024年最新最全教程)
最后你可能看见这个页面(用的官方案例):没出现图正常,点击这个就出现了
2. 启动 Neo4j
安装完成后,打开 Neo4j Desktop,选择 New Project
创建一个新项目,接着点击 Add Database
,选择默认数据库类型。随后,你可以启动这个数据库,并进入 Neo4j 浏览器界面。该浏览器为一个内置的查询工具,可以在其中输入 Cypher 查询语句。
Cypher 查询语言
Cypher 是 Neo4j 提供的声明式查询语言,专门用于操作图数据。它与 SQL 类似,但更加适合图数据库的数据结构,包括节点(Nodes)、关系(Relationships)和属性(Properties)。Cypher 的核心在于通过图模式匹配来查询和操作数据,具有直观的语法设计。
1. 基本概念与术语
在 Cypher 中,数据的结构由 节点(Node)、关系(Relationship) 和 属性(Property) 组成。
-
节点 (Node): 实体,表示图中的对象。使用圆括号
( )
来表示。- 例:
(n)
表示一个节点,(a:Person)
表示类型为 “Person” 的节点。
- 例:
-
关系 (Relationship): 两个节点之间的连接。用方括号
[ ]
表示,方向用箭头->
或<-
表示。- 例:
(a)-[r:KNOWS]->(b)
表示节点a
和节点b
之间的 “KNOWS” 关系。
- 例:
-
属性 (Property): 节点或关系的键值对,用花括号
{}
表示。- 例:
(a:Person {name: 'Alice', age: 30})
表示节点a
有两个属性name
和age
。
- 例:
2. 创建数据
Cypher 提供了 CREATE
语句来创建节点、关系及其属性。基本的语法是:
2.1 创建节点
CREATE (n:Label {propertyKey: propertyValue, ...})
例子:
// 创建一个名称为 Alice,年龄为 30 的 "Person" 节点
CREATE (a:Person {name: 'Alice', age: 30});
输入到红框里,点击右面蓝色三角形运行后,会到下方,记录你的每一步操作。
2.2 创建关系
CREATE (node1)-[relationship:TYPE]->(node2)
例子:
// 创建 Alice 和 Bob 节点之间的关系,表示 Alice 认识 Bob
MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:KNOWS]->(b);
3. 查询数据
Cypher 查询的核心是 MATCH
语句,用来匹配图中的模式,并返回相关的节点和关系。基本的语法是:
3.1 查询节点
MATCH (n:Label {propertyKey: propertyValue, ...})
RETURN n;
例子:
// 查询所有名称为 Alice 的 "Person" 节点
MATCH (n:Person {name: 'Alice'})
RETURN n;
3.2 查询关系
MATCH (n1:Label1)-[r:RELATIONSHIP_TYPE]->(n2:Label2)
RETURN n1, r, n2;
例子:
// 查询 Alice 认识谁
MATCH (a:Person {name: 'Alice'})-[:KNOWS]->(b)
RETURN a, b;
3.3 查询特定属性
可以通过 WHERE
子句来过滤查询结果,类似 SQL 中的 WHERE
。
MATCH (n:Label)
WHERE n.propertyKey = propertyValue
RETURN n;
例子:
// 查询所有年龄大于 30 的 "Person"
MATCH (n:Person)
WHERE n.age > 30
RETURN n;
4. 更新数据
Cypher 提供了 SET
语句来更新节点或关系的属性。
4.1 更新节点的属性
MATCH (n:Label {propertyKey: propertyValue, ...})
SET n.propertyKey = newValue
RETURN n;
例子:
// 更新 Alice 的年龄为 35
MATCH (a:Person {name: 'Alice'})
SET a.age = 35
RETURN a;
4.2 为节点添加新属性
MATCH (n:Label {propertyKey: propertyValue, ...})
SET n.newPropertyKey = newPropertyValue
RETURN n;
例子:
// 为 Alice 添加一个新的属性 country,值为 'USA'
MATCH (a:Person {name: 'Alice'})
SET a.country = 'USA'
RETURN a;
4.3 更新关系的属性
MATCH (n1)-[r:RELATIONSHIP_TYPE]->(n2)
SET r.propertyKey = newValue
RETURN r;
例子:
// 更新 Alice 和 Bob 之间的认识时间为 2023
MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
SET r.since = 2023
RETURN r;
5. 删除数据
Cypher 提供 DELETE
语句来删除节点、关系。
5.1 删除节点
MATCH (n:Label {propertyKey: propertyValue, ...})
DELETE n;
例子:
// 删除 Alice 节点
MATCH (a:Person {name: 'Alice'})
DELETE a;
注意:删除节点时,如果节点还有关系存在,Neo4j 会抛出错误,必须先删除相关的关系。
5.2 删除关系
MATCH (n1)-[r:RELATIONSHIP_TYPE]->(n2)
DELETE r;
例子:
// 删除 Alice 和 Bob 之间的认识关系
MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
DELETE r;
在 Neo4j 中,如果你想删除数据库中的所有数据,可以使用 MATCH
语句结合 DELETE
操作,删除所有的节点及其关联的关系。以下是具体步骤:
5.3. 删除所有关系
在 Neo4j 中,节点之间的关系是必须先删除的,才能删除节点。可以通过以下命令删除图中的所有关系:
MATCH ()-[r]-()
DELETE r;
此语句会匹配数据库中的所有关系 [r]
并删除它们。这里的 ( )-[r]-( )
表示图中的所有节点之间的关系。
5.4. 删除所有节点
关系删除后,可以删除所有节点。使用以下命令:
MATCH (n)
DELETE n;
此命令将删除数据库中的所有节点 (n)
。
一步完成:删除所有节点和关系
可以将以上两步合并成一步,直接删除图中所有的数据(节点及其关系):
MATCH (n)
DETACH DELETE n;
DETACH DELETE
会自动删除节点和所有相关的关系,因此可以一步删除整个数据库的数据。
注意
- 执行
DETACH DELETE
会彻底清空数据库中的所有数据,这个操作是不可逆的。 - 该操作适合于开发或测试环境,避免在生产环境误操作。
6. 合并数据 (MERGE)
MERGE
语句用于查找或创建节点或关系。如果图中不存在匹配的节点或关系,MERGE
会创建它们;如果已经存在,则不会创建。
MERGE (n:Label {propertyKey: propertyValue, ...})
例子:
// 如果图中没有名为 Charlie 的 "Person" 节点,则创建一个
MERGE (c:Person {name: 'Charlie'});
7. 聚合函数与分组查询
Cypher 提供了许多聚合函数,如 COUNT
, SUM
, AVG
, MIN
, MAX
,并支持使用 WITH
子句进行分组。
7.1 计数节点
MATCH (n:Label)
RETURN COUNT(n);
例子:
// 统计 "Person" 节点的数量
MATCH (p:Person)
RETURN COUNT(p);
7.2 按属性分组
MATCH (n:Label)
WITH n.propertyKey AS groupKey, COUNT(n) AS count
RETURN groupKey, count;
例子:
// 按年龄分组,统计每个年龄的人数
MATCH (p:Person)
WITH p.age AS age, COUNT(p) AS count
RETURN age, count;
8. 路径查询
在图数据库中,路径 是一个非常重要的概念。Cypher 可以查询节点之间的路径及其长度。
MATCH path = (n1)-[r*..length]-(n2)
RETURN path;
例子:
// 查找 Alice 和 Bob 之间所有长度不超过 3 的路径
MATCH path = (a:Person {name: 'Alice'})-[*..3]-(b:Person {name: 'Bob'})
RETURN path;
9. 深度查询与递归关系
通过使用 *
可以进行递归查询。例如,查询两个节点之间的多级关系。
MATCH (n1)-[r*..depth]->(n2)
RETURN n1, r, n2;
例子:
// 查找 Alice 认识的所有人及其认识的人的关系
MATCH (a:Person {name: 'Alice'})-[*..2]-(b)
RETURN a, b;
Cypher 总结(为了你能回答别人)
Cypher 作为 Neo4j 的查询语言,专注于图形数据的直观查询和操作。其简洁、强大的语法,使得开发者能够高效地进行复杂的关系分析。在大规模知识图谱、社交网络和推荐系统等场景中,Cypher 的图模式匹配能力为数据分析提供了不可替代的优势。
Cypher 的灵活性使得图查询可以非常高效地与业务需求结合,尤其是在需要探索复杂关系链时,它的表现尤为出色。
Cypher高阶用法
知识图谱入门——6:Cypher 查询语言高级组合用法(查询链式操作、复杂路径匹配、条件逻辑、动态模式创建,以及通过事务控制和性能优化处理大规模数据。
总结
Neo4j 的出现填补了传统关系型数据库在复杂关系处理上的不足,特别是在知识图谱构建和图分析任务中,它展现出独特的优势。传统关系型数据库虽然能通过表结构和外键管理关系数据,但在处理深层次和复杂关系查询时性能较差。而 Neo4j 通过其图形化的数据模型,专注于关系的高效存储与查询,能够以直观的方式呈现复杂的数据实体与其间的关联。
在知识图谱构建中,数据通常高度互联,需要处理多跳关系查询和复杂的推理任务。Neo4j 的图遍历算法和灵活的 Cypher 查询语言大大简化了这些任务,开发者可以轻松表达和探索图中的复杂结构。这为快速挖掘隐藏在数据中的深层次知识和模式提供了强有力的支持。
然而,Neo4j 也有其局限性,特别是在大规模数据的写入场景中。图数据库的结构要求在插入数据时进行更多的图关系维护,这导致其写入性能相对较弱。此外,由于每个节点和关系都有额外的元数据存储需求,存储空间开销也较大。这意味着在构建大规模动态数据系统时,开发者可能需要权衡写入效率与查询性能,或结合其他大数据技术进行优化。
以下是 Neo4j 在功能表现上的优缺点分析:
功能 | 优点 | 不足 |
---|---|---|
关系查询 | 高效,多跳查询快速 | 大规模写入性能不佳 |
数据模型 | 直观,易理解 | 存储空间开销较大 |
社区支持 | 丰富API,活跃社区 | 事务一致性稍弱 |
扩展能力 | 灵活的扩展机制 | 分布式支持相对有限 |
学习成本 | 图形化表达直观 | Cypher 学习要求较高 |
在大数据时代,Neo4j 的优势特别体现在需要快速挖掘复杂关系和构建知识网络的场合,尤其是大规模数据关联性强的场景中。作为图谱开发者,我认为 Neo4j 最理想的应用场景是在知识图谱、社交网络分析、推荐系统等复杂关系密集的领域。通过其高效的关系查询和直观的数据建模,开发者可以快速发现数据中的潜在模式和知识关联。
但对于涉及频繁大量写入的数据场景,性能可能成为瓶颈,尤其是在处理实时动态数据时,需要结合诸如 Kafka、Spark 这样的技术来处理高并发写入需求,确保系统的整体性能和稳定性。
相关文章:

知识图谱入门——5:Neo4j Desktop安装和使用手册(小白向:Cypher 查询语言:逐步教程!Neo4j 优缺点分析)
Neo4j简介 Neo4j 是一个基于图结构的 NoSQL 数据库,专门用于存储、查询和管理图形数据。它的核心思想是使用节点、关系和属性来描述数据。图数据库非常适合那些需要处理复杂关系的数据集,如社交网络、推荐系统、知识图谱等领域。 与传统的关系型数据库…...

35个数据分析模型
这些数据分析模型覆盖了战略规划、市场营销、运营管理、用户行为、财务分析等多个方面,是企业和组织在进行决策分析时常用的工具。分享给大家,如果想要PDF下载: https://edu.cda.cn/group/4/thread/178782 1、SWOT模型 SWOT模型是一种战略分…...

Java | Leetcode Java题解之第457题环形数组是否存在循环
题目: 题解: class Solution {public boolean circularArrayLoop(int[] nums) {int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {continue;}int slow i, fast next(nums, i);// 判断非零且方向相同while (nums[slow] * nums[fast]…...

date:10.4(Content:Mr.Peng)( C language practice)
void reverse(char* p, int len) {char* left p;char* right p len - 2;while (left < right){char* temp left;*left *right;//当*left*right后,*temp已经被改为f了*right *temp;//你再*temp赋值给*right时,已经没用了left;right--;}}int main…...
【K8S系列】Kubernetes 集群中的网络常见面试题
在 Kubernetes 面试中,网络是一个重要的主题。理解 Kubernetes 网络模型、服务发现、网络策略等概念对候选人来说至关重要。以下是一些常见的 Kubernetes 网络面试题及其答案,帮助你准备面试。 1. Kubernetes 的网络模型是什么样的? 问题&am…...

Android 无Bug版 多语言设计方案!
出海业务为什么要做多语言? 1.市场扩大与本地化需求: 通过支持多种语言,出海项目可以触及更广泛的国际用户群体,进而扩大其市场份额。 本地化是吸引国际用户的重要策略之一,而语言本地化是其中的核心。使用用户的母语…...

Nginx02-安装
零、文章目录 Nginx02-安装 1、Nginx官网 Nginx官网地址:http://nginx.org/ 2、Nginx下载 (1)Nginx下载 下载页地址:http://nginx.org/en/download.html (2)更老版本下载 下载页地址:http…...
大模型基础架构
Transformer 设计者:Google 特点:最流行,几乎所有大模型都用它 代码:https://github.com/openai/finetune-transformer-lm/blob/master/train.py RWKV 设计者:PENG Bo 特点:可并行训练,推理性…...
MySQL 实验 10:数据查询(3)—— 聚合函数与分组查询
MySQL 实验 10:数据查询(3)—— 聚合函数与分组查询 目录 MySQL 实验 10:数据查询(3)—— 聚合函数与分组查询一、聚合函数1、计数函数(COUNT)2、求和函数(SUM࿰…...

感知机学习算法
感知机 一、感知机简介二、感知机模型2.1 感知机的基本组成2.2 求和函数2.2.1 时间总合2.2.2 空间总合 2.3 激活函数2.4 学习算法2.4.1 赫布学习规则2.4.2 Delta学习规则 三、 结论参考文献 一、感知机简介 M-P神经元模型因其对生物神经元激发过程的极大简化而成为神经网络研究…...

2024年双十一有什么好物推荐?双十一必买清单大汇总
随着科技的飞速发展,数码产品已成为我们生活中不可或缺的伙伴。2024年双十一购物狂欢节即将来临,众多消费者早已摩拳擦掌,准备在这个年度盛事中淘到心仪的数码好物。在这个信息爆炸的时代,如何从琳琅满目的商品中挑选出性价比高、…...

C语言贪吃蛇
#只讲逻辑不讲一些基础,基础大概过一遍就行# project-one: 无 (gitee.com)仓库里面有原代码 一、基础工作 1、先将你的编译器换成32位环境,也就是x86, 如果是控制台主机窗口则管,若不是需要改为控制台主机窗口 打开运行窗口后点…...
SpringBoot宠物咖啡馆平台:创新设计与高效实现
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…...

李宏毅深度学习-梯度下降和Batch Normalization批量归一化
Gradient Descent梯度下降 ▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头(loss等高线的法线方向) Tip1: Tuning your learning rates Adaptive Learning Rates自适应lr 通常lr会越来越小 Adaptive Learning Rates中每个参数都给它不…...

java集合框架都有哪些
Java集合框架(Java Collections Framework)是Java提供的一套设计良好的支持对一组对象进行操作的接口和类。这些接口和类定义了如何添加、删除、遍历和搜索集合中的元素。Java集合框架主要包括以下几个部分: 接口: Collection&…...
笔记整理—linux进程部分(8)线程与进程
前面用了高级IO去实现鼠标和键盘的读取,也说过要用多进程方式进行该操作: int mian(void) {int ret-1;int fd-1;char bug[100]{0};retfork();if(0ret){//子进程,读鼠标}if(0<ret){//父进程,读键盘}else{perror("fork&quo…...
使用 Python 实现遗传算法进行无人机路径规划
目录 使用 Python 实现遗传算法进行无人机路径规划引言1. 遗传算法概述1.1 定义1.2 基本步骤1.3 遗传算法的特点 2. 使用 Python 实现遗传算法2.1 安装必要的库2.2 定义类2.2.1 无人机模型类2.2.2 遗传算法类 2.3 示例程序 3. 遗传算法的优缺点3.1 优点3.2 缺点 4. 改进方向5. …...

JAVA基础: synchronized 和 lock的区别、synchronized锁机制与升级
1 synchronized 和 lock的区别 synchronized是一个关键字, lock是一个接口,实际使用的是实现类 synchronized通过触发的是系统级别的锁机制, lock是API级别的锁机制 synchronized自动获得锁,自动释放锁。 lock需要通过方法获得锁…...

自动驾驶 车道检测实用算法
自动驾驶 | 车道检测实用算法 车道识别是自动驾驶领域的一个重要问题,今天介绍一个利用摄像头图像进行车道识别的实用算法。该算法利用了OpenCV库和Udacity自动驾驶汽车数据库的相关内容。 该算法包含以下步骤: 摄像头校准,以移除镜头畸变&…...

22.第二阶段x86游戏实战2-背包遍历REP指令详解
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...