图数据库的力量:深入理解与应用 Neo4j

news2024/9/20 18:37:29

图数据库的力量:深入理解与应用 Neo4j

文章目录

    • 图数据库的力量:深入理解与应用 Neo4j
      • 1、什么是 Neo4j?
        • 版本说明
      • 2、Neo4j 的部署和安装
        • Neo4j Web 工具介绍
      • 3、体验 Neo4j
        • 加载数据
        • 查询数据
        • 数据结构
      • 4、Cypher 入门
        • 创建数据
        • 查询数据
        • 关系深度查询
        • 分页查询
        • 更新数据
        • 删除数据
        • 索引

1、什么是 Neo4j?

Neo4j 是由 Java 实现的开源 NoSQL 图数据库。自 2003 年开始开发,2007 年正式发布第一版并将源码托管于 GitHub。作为图数据库的代表产品,Neo4j 已经在众多行业项目中广泛应用,如网络管理、软件分析、组织和项目管理及社交网络等。

Neo4j 官网: https://neo4j.com/

Neo4j 提供了专业数据库级别的图数据模型存储,具备完整的数据库特性,包括 ACID 事务支持、集群支持、备份和故障转移等功能。

它还支持声明式查询语言 Cypher,这种语言类似于关系型数据库中的 SQL,操作简单,表现力强,查询效率高,且具有良好的扩展性。

下图演示了 Neo4j 的典型数据存储方式:

图数据库例子

在上图中,紫色圆圈代表【人】数据,橙色圆圈代表【电影】数据,展示了人和电影之间参演或导演的关系。

版本说明

Neo4j 提供以下两个版本:

  • 社区版(Community Edition):具备了基本功能,适合开发环境使用。
  • 企业版(Enterprise Edition):相对于社区版增加了集群部署、高级监控、高级缓存、在线备份等功能,建议在生产环境中使用。

企业版从 3.2 版本开始支持集群,能够在不受地理位置限制的情况下实现事务 ACID 特性。更多信息请参考:Neo4j 企业版特性

2、Neo4j 的部署和安装

Neo4j 支持多个平台的部署和安装,包括 Windows、Mac 和 Linux 等系统。在安装 Neo4j 之前,请确保已安装 Java 虚拟机。

使用 Docker 进行安装的命令如下:

docker run \
-d \
--restart=always \
--name neo4j \
-p 7474:7474 \
-p 7687:7687 \
-v neo4j:/data \
neo4j:4.4.5

# 7474 是 web 管理工具的端口,7687 是 Neo4j 协议端口用于数据通信
Neo4j Web 工具介绍

Neo4j 提供了一个便捷的 Web 工具,可以进行数据库的 CRUD 操作。

Neo4j Web工具

3、体验 Neo4j

以下是通过官方提供的电影数据来实战体验 Neo4j 的步骤:

数据体验

加载数据

首先,选择并加载数据:

加载数据

系统会自动将创建数据的 Cypher 语句加载到输入框中,点击执行:

执行加载数据

执行成功后,可以看到数据已经成功导入:

数据导入成功

查询数据

例如,查询【Tom Hanks】参演了哪些电影的 Cypher 语句如下:

MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom, tomHanksMovies

查询结果如下图所示:

查询结果

数据结构

在 Neo4j 中,数据通过节点、属性、关系和标签来存储。以下是具体说明:

数据结构

  • 节点:存储实体数据(如上图中的演员和电影),类似于关系型数据库中的表。
  • 关系:存储节点之间的关系。每个关系只能有一个类型,必须有开始和结束节点,并且可以循环引用,但不能留空。
  • 属性:节点和关系都可以有属性,由键值对组成。节点的属性类似于关系型数据库中的字段,而关系属性则进一步明确了关系属性。
  • 标签:用于对节点进行分类,使 Neo4j 数据模型更易于构建。在上面的电影案例中,Movie 和 Person 即是标签。

4、Cypher 入门

Cypher 是 Neo4j 的查询语言,类似于关系型数据库中的 SQL,一些关键词来源于 SQL,比如:CREATE、WHERE、RETURN 等。下面我们一起学习 Cypher 的基本语句。

Cypher 语句的关键字对大小写不敏感。

创建数据
// 查询所有数据
MATCH (n) RETURN n

// 删除所有节点和关系,慎用!
MATCH (n) DETACH DELETE n

// 创建一个具有 name 属性的节点,变量 n 代表该节点,创建完成后返回该节点
CREATE (n {name: $value}) RETURN n

// 创建一个指定标签($Tag)的节点
CREATE (n:$Tag {name: $value})

// 创建 n 指向 m 的关系,并且指定关系类型为 KNOWS
CREATE (n)-[r:KNOWS]->(m)

// 示例
// 创建节点,并赋予 name 属性
CREATE (n {name:'迪士尼营业部'})
CREATE (n:AGENCY {name:'航头营业部'})

// 创建浦东新区转运中心、上海转运中心节点,并且创建关系类型为 IN_LINE,创建完成后返回节点和关系
// TLT -> Two Level Transport(二级转运中心)
// OLT -> One Level Transport(一级转运中心)
CREATE (n:TLT {name:'浦东新区转运中心'}) -[r:IN_LINE]-> (m:OLT {name:'上海转运中心'}) RETURN n,r,m

// 关系可以是反向的,并且可以为关系指定属性
CREATE (n:TLT {name:'浦东新区转运中心'}) <-[r:OUT_LINE]- (m:OLT {name:'上海转运中心'}) RETURN n,r,m

在上面的示例中,我们先后创建了节点、指定标签的节点以及带有特定关系类型的节点。示例代码展示了如何创建双向关系,并且为关系指定属性。

查询数据
// 匹配某个条件的节点
MATCH (n:AGENCY {name: "航头营业部"}) RETURN n

// 查询具有一定条件的节点及其关系,并按照一定顺序返回数据
MATCH (n)-[:KNOWS]->(m) WHERE m.name = "Tom Hanks" RETURN n, m ORDER BY n.name ASC
关系深度查询

可以指定关系的深度进行查询,语法格式:-[:TYPE*minHops..maxHops]->

例如,六度分隔(Six Degrees of Separation)理论表明,你和任何一个陌生人之间所间隔的中间人不会超过六个,也就是说,最多通过六个人你就能认识任何一个陌生人。

// 查询【北京市转运中心】关系中深度为 1~2 层的节点
MATCH (n:OLT {name:"北京市转运中心"}) -[*1..2]->(m) RETURN *

// 可以简写为
MATCH (n:OLT {name:"北京市转运中心"}) -[*..2]->(m) RETURN *

// 通过变量查询
MATCH path = (n:OLT {name:"北京市转运中心"}) -[*..2]->(m) RETURN path

// 获取结果中的关系,WITH 语句将结果传递给下一个查询
MATCH path = (n:OLT {name:"北京市转运中心"}) -[*..2]->(m)
WITH n, m, relationships(path) AS r
RETURN r

// 查询两个网点之间所有的路径,最大深度为 6
MATCH path = (n:AGENCY) -[*..6]->(m:AGENCY)
WHERE n.name = "北京市昌平区定泗路" AND m.name = "上海市浦东新区南汇"
RETURN path

// 查询两个网点之间的最短路径,查询深度最大为 10
MATCH path = shortestPath((n:AGENCY) -[*..10]->(m:AGENCY))
WHERE n.name = "北京市昌平区定泗路" AND m.name = "上海市浦东新区南汇"
RETURN path

// 查询两个网点之间所有路径中成本最低的一条路径,最大深度为 10
MATCH path = (n:AGENCY) -[*..10]->(m:AGENCY)
WHERE n.name = "北京市昌平区定泗路" AND m.name = "上海市浦东新区南汇"
UNWIND relationships(path) AS r
WITH sum(r.cost) AS cost, path
RETURN path ORDER BY cost ASC, LENGTH(path) ASC LIMIT 1

// UNWIND 将列表数据展开
// sum() 是聚合函数,类似的还有 avg()、max()、min() 等
分页查询
// 分页查询网点,按照 bid 正序排序,每页查询 2 条数据

// 第一页
MATCH (n:AGENCY) 
RETURN n ORDER BY n.bid ASC SKIP 0 LIMIT 2

// 第二页
MATCH (n:AGENCY)
RETURN n ORDER BY n.bid ASC SKIP 2 LIMIT 2
更新数据

更新数据使用 SET 语句进行标签、属性的更新。SET 操作是幂等性的。

// 更新或设置属性
MATCH (n:AGENCY {name:"北京市昌平区新龙城"})
SET n.address = "龙跃苑四区3号楼底商101号"
RETURN n

// 移除属性
MATCH (n:AGENCY {name:"北京市昌平区新龙城"}) 
REMOVE n.address 
RETURN n

// 给没有 address 属性的节点增加 address 属性
MATCH (n:AGENCY) 
WHERE n.address IS NULL 
SET n.address = "暂无地址" 
RETURN n
删除数据

删除数据通过 DELETE 和 DETACH DELETE 完成。DELETE 不能删除有关系的节点,删除关系需要使用 DETACH DELETE。

// 删除节点
MATCH (n:AGENCY {name:"航头营业部"})
DELETE n

// 有关系的节点不能直接删除
MATCH (n:AGENCY {name:"北京市昌平区新龙城"})
DELETE n

// 删除节点及其所有关系
MATCH (n:AGENCY {name:"北京市昌平区新龙城"})
DETACH DELETE n

// 删除所有节点和关系,慎用!
MATCH (n)
DETACH DELETE n
索引

给节点添加索引以提高查询效率。

// 创建索引语法
CREATE [TEXT] INDEX [index_name] [IF NOT EXISTS]
FOR (n:LabelName)
ON (n.propertyName)
[OPTIONS "{" option: value[, ...] "}"]

// 示例
CREATE TEXT INDEX agency_index_bid IF NOT EXISTS FOR (n:AGENCY) ON (n.bid)

// 删除索引语法
DROP INDEX [index_name]

// 示例
DROP INDEX agency_index_bid

通过对 Neo4j 的深入理解与应用,图数据模型的强大优势得以展现。无论是复杂关系存储还是高效查询,Neo4j 都表现出色。希望这些详细的示例和说明能帮助你更好地掌握 Neo4j,为实际项目应用打下坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab simulink建模与仿真 第十五章(信号源库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号源库中的模块概览 注&#xff1a;部分模块在第二章中有介绍&#xff0c;本章不再赘述。 二、from输入源模块 1、From Workspace模块 &#xff08;1&#xff09;该模块可从MATLAB工作区、模型工作区…

JVM 运行时数据区域

目录 前言 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 前言 首先, java程序在被加载在内存中运行的时候, 会把他自己管理的内存划分为若干个不同的数据区域, 就比如你是一个你是一个快递员, 一堆快递过来需要你分拣, 这个时候, 你就需要根据投放的目…

数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例

时间序列概况在日常生活和专业研究中都很常见。简而言之,时间序列概况是一系列连续的数据点 y(0), y(1), …, y(t) ,其中时间 t 的点依赖于时间 t-1 的前一个点(或更早的时间点)。 在许多应用中,研究者致力于预测时间序列概况的未来行为。存在各种建模方法。这些模型通常基于过…

Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 在本章中&#xff0c;我们开始编写面向用户的界面&#xff0c;其中只涉及简单的HTML结构&#xff0c;不会做太多美化&#xff0c;目的就是把后台创建的数据展示到前台。 从技术上来讲&#xff0c;这一节将涉及Django 中function view和 class-based view 的用…

用Python实现时间序列模型实战——Day 22: LSTM 与 RNN 模型

一、学习内容 1. 长短期记忆网络 (LSTM) 的原理 LSTM&#xff08;长短期记忆网络&#xff09; 是一种专门用于处理时间序列数据的神经网络&#xff0c;它克服了传统 RNN 在处理长序列时出现的梯度消失问题。LSTM 通过引入 记忆单元 和 门控机制&#xff08;输入门、遗忘门、输…

Ruffle 继续在开源软件中支持 Adobe Flash Player

大多数人已经无需考虑对早已寿终正寝的 Adobe Flash 的支持&#xff0c;但对于那些仍有一些 Adobe Flash/SWF 格式的旧资产&#xff0c;或想重温一些基于 Flash 的旧游戏/娱乐项目的人来说&#xff0c;开源 Ruffle 项目仍是 2024 年及以后处理 Flash 的主要竞争者之一。 Ruffl…

【Hot100】LeetCode—4. 寻找两个正序数组的中位数

目录 1- 思路题目识别二分 2- 实现⭐4. 寻找两个正序数组的中位数——题解思路 3- ACM 实现 原题链接&#xff1a;4. 寻找两个正序数组的中位数 1- 思路 题目识别 识别1 &#xff1a;给定两个数组 nums1 和 nums2 &#xff0c;找出数组的中位数 二分 思路 将寻找中位数 —…

Python数据分析案例59——基于图神经网络的反欺诈交易检测(GCN,GAT,GIN)

以前的数据分析案例的文章可以参考&#xff1a;数据分析案例 案例背景 以前二维的表格数据的机器学习模型都做烂了&#xff0c;[线性回归,惩罚回归,K近邻,决策树,随机森林,梯度提升,支持向量机,神经网络]&#xff0c;还有现在常用的XGBoost&#xff0c;lightgbm&#xff0c;ca…

ffmpeg实现视频的合成与分割

视频合成与分割程序使用 作者开发了一款软件&#xff0c;可以实现对视频的合成和分割&#xff0c;界面如下&#xff1a; 播放时&#xff0c;可以选择多个视频源&#xff1b;在选中“保存视频”情况下&#xff0c;会将多个视频源合成一个视频。如果只取一个视频源中一段视频…

keil5进行stm32编程时常遇到的问题和ST-LINK在线仿真的连接问题

本文记录原因 最近一直在尝试usb的自定义键盘、无刷电机和pcb的一些东西&#xff0c;很久没使用stm32编写程序了。在浏览购物网站的时候发现很多便宜的小系统板。 使用小的系统板原因 1&#xff0c;在网上看到板子很便宜&#xff0c;以前很少看见&#xff0c;但现在网上对这…

大数据新视界 --大数据大厂之数据科学项目实战:从问题定义到结果呈现的完整流程

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

uniapp 知识总结

1. uniapp 知识总结 uni-app是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Harmony、Web&#xff08;响应式&#xff09;以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、…

【webpack4系列】设计可维护的webpack4.x+vue构建配置(终极篇)

文章目录 构建配置包设计通过多个配置文件管理不同环境的 webpack 配置抽离成一个 npm 包统一管理&#xff08;省略&#xff09;通过 webpack-merge 组合配置 功能模块设计目录结构设计构建配置插件安装webpack、webpack-cli关联HTML插件html-webpack-plugin解析ES6解析vue、JS…

笔记本安装Linux系统向日葵远程控制

1、制作启动U盘 Ubuntu&#xff1a; Create a bootable USB stick with Rufus on Windows 2、安装 1、重启笔记本&#xff0c;出现logo后&#xff0c;按 f2&#xff08;注&#xff1a;联想拯救者。其他型号参考官方文档&#xff09;。按左右方向键切换到 Boot。选择 Boot Mo…

【软件测试】--xswitch将请求代理到测试桩

背景 在做软件测试的过程中&#xff0c;经常会遇见需要后端返回特定的响应数据&#xff0c;这个时候就需要用到测试桩&#xff0c;进行mock测试。 测试工程师在本地模拟后端返回数据时&#xff0c;需要将前端请求数据代理到本地&#xff0c;本文介绍xswitch插件代理请求到flas…

Float类型的有效位数有几位

大家好&#xff0c;今天我们来聊一聊C语言中的Float类型。 正如标题所说&#xff0c;你知道Float类型的有效位数有几位吗&#xff1f; 或者你知道为什么Float类型可以表示数字16777218但是却无法表示16777217吗&#xff1f; 如果你不是很确定那我们就一起来看看吧&#xff0…

AcWing算法基础课-789数的范围-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》789 题——数的范围。本文详细解析了一个基于二分查找的算法题&#xff0c;题目要求在有序数组中查找特定元素的首次和最后一次出现的位置。通过使用两个二分查找函数&#xff0c;程序能够高效…

数据结构(Day13)

一、学习内容 内存空间划分 1、一个进程启动后&#xff0c;计算机会给该进程分配4G的虚拟内存 2、其中0G-3G是用户空间【程序员写代码操作部分】【应用层】 3、3G-4G是内核空间【与底层驱动有关】 4、所有进程共享3G-4G的内核空间&#xff0c;每个进程独立拥有0G-3G的用户空间 …

【C++】深入理解作用域和命名空间:从基础到进阶详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、域的概念 1. 类域 2. 命名空间…

Redis——常用数据类型string

目录 常用数据结构&#xff08;类型&#xff09;Redis单线程模型Reids为啥效率这么高&#xff1f;速度这么快&#xff1f;&#xff08;参照于其他数据库&#xff09; stringsetgetMSET 和 MGETSETNX&#xff0c;SETEX&#xff0c;PSETEXincr&#xff0c;incrby&#xff0c;decr…