当前位置: 首页 > news >正文

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

图数据库的力量:深入理解与应用 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,为实际项目应用打下坚实基础。

相关文章:

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

图数据库的力量&#xff1a;深入理解与应用 Neo4j 文章目录 图数据库的力量&#xff1a;深入理解与应用 Neo4j1、什么是 Neo4j&#xff1f;版本说明 2、Neo4j 的部署和安装Neo4j Web 工具介绍 3、体验 Neo4j加载数据查询数据数据结构 4、Cypher 入门创建数据查询数据关系深度查…...

Deutsch intensiv C1 Schreiben

Deutsch intensiv C1 Schreiben Part A1, Kasten Part A 1, Kasten (1)zeigt (A) (2)gibt Auskunft ber (A)/darber (3)liefert Daten/Informationen ber(A)/darber (4)stellt(A) dar...

大数据新视界 --大数据大厂之DevOps与大数据:加速数据驱动的业务发展

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

实战OpenCV之图像阈值处理

基础入门 图像阈值处理是一种二值化技术&#xff0c;它基于预设的阈值&#xff0c;可以将图像中的像素分为两大类&#xff1a;一大类是背景&#xff0c;另一大类是前景或目标对象。这个过程涉及将图像中的每个像素值与阈值进行比较&#xff0c;并根据比较结果决定保留原始值还是…...

登录后继续执行方法

场景 点击按钮&#xff0c;检测到未登录&#xff0c;直接跳转到登录页&#xff0c;登录成功后&#xff0c;返回页面继续执行刚才的点击事件 思路 在跳转时用一个队列存储该事件&#xff0c;登录成功后执行队列里的事件 队列 class Queue {constructor() {this.task []}cl…...

JVM-类加载器的双亲委派模型详解

JVM中存在三个默认的类加载器&#xff1a; BootstrapClassLoaderExtClassLoaderAppClassLoader AppClassLoader的父加载器是ExtClassLoader&#xff0c;ExtClassLoader的父加载器是 BootstrapClassLoader。 它们之间的关系是&#xff1a;AppClassLoader->ExtClassLoader-&…...

【计算机基础题目】Linux系统中文件权限 字母权限和数字权限的相互转换

创作日志&#xff1a; 很久之前对这个略有了解&#xff0c;但是现在完全忘记了&#xff0c;看到这类题目一脸懵逼&#xff0c;现在系统复习下。 1、权限的数字表示&#xff08;3位&#xff09; 在Linux系统中&#xff0c;文件权限由一个三位的八进制数表示&#xff0c;每一位代…...

VRRP协议原理

目录 VRRP概述 VRRP产生背景 VRRP介绍 VRRP相关概念 VRRP报文 VRRP的三种状态 VRRP工作原理 优先级和抢占 VRRP接口跟踪 VRRP概述 VRRP产生背景 通常同一网段内的所有主机都会配置相同的网关&#xff0c;以访问外部网络 当唯一的网关设备发生故障时&#xff0c;所有主…...

Dockerfile自定义制作镜像,其中10个指令的作用分析

docker容器中 做镜像是重要的技能。 docker commit只能制作比较简单的镜像&#xff0c; 要制作比较完善的镜像&#xff0c; 自定义程度比较高的&#xff0c; 就需要用到dockerfile dockerfile可以回溯历史 动态生成镜像。 FROM是基础镜像 CMD是在容器创建的时候默认的启动命令 …...

Linux6-vi/vim

1.vi与vim vi是Linux操作系统下的标准编辑器&#xff0c;类似Windows下的记事本 vim是vi的升级版&#xff0c;包括vi的所有功能&#xff0c;而且支持shell 2.vi/vim下的三种模式 vi/vim有三种模式&#xff1a;命令模式&#xff0c;插入模式和底行模式 命令模式&#xff1a…...

2012年408考研真题-数据结构

8.【2012统考真题】求整数n(n≥0)的阶乘的算法如下&#xff0c;其时间复杂度是(&#xff09;。 int fact(int n){ if(n<1) return 1; return n*fact (n-1); } A. O(log2n) B. O(n) C. O(nlog2n) D. O(n^2) 解析&#xff1a; 观察代码&#xff0c;我们不…...

【北京迅为】《STM32MP157开发板使用手册》- 第四十章 二值信号量实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…...

Docker UI强大之处?

DockerUI是一款由国内开发者打造的优秀Docker可视化管理工具。它拥有简洁直观的用户界面&#xff0c;使得Docker主机管理、集群管理和任务编排变得轻松简单。DockerUI不仅能展示资源利用率、系统信息和更新日志&#xff0c;还提供了镜像管理功能&#xff0c;帮助用户高效清理中…...

前端面试题——token安全问题处理与大数据列表展示

1.长时间保存token问题 长时间保存Token涉及多个方面的问题&#xff0c;包括安全性、性能、以及Token的管理策略等。以下是对长时间保存Token问题的详细分析&#xff1a; 一、安全性问题 Token泄露风险&#xff1a; Token是用户身份验证的凭证&#xff0c;如果长时间保存且未…...

Flask项目入门和视图

1、第一个项目的结构 以示例代码中的入口文件app.py为例子 &#xff08;1&#xff09;引入Flask以及创建Flask对象 from flask import Flask app Flask(__name__)&#xff08;2&#xff09; 路由route 视图函数 app.route(/index/) def hello_world():# 响应&#xff1a;…...

深入理解Lucene:开源全文搜索引擎

目录 引言 Lucene的核心概念 索引 分析器 存储 Lucene的工作流程 创建索引 搜索索引 Lucene核心技术 倒排索引 排序算法 索引压缩与合并 并发控制与实时更新 结论 引言 随着互联网的飞速发展&#xff0c;信息量呈指数级增长&#xff0c;如何有效地管理和检索这些…...

Qt中pro项目文件配置介绍

Qt中&#xff0c;工程文件是以.pro后缀的文件&#xff0c;主要用以包含Qt模块&#xff0c;代码文件&#xff0c;依赖库&#xff0c;以及对项目的一些属性进行配置。 具体看个例子&#xff1a; #这块是添加Qt模块 #.pro文件中使用#号作为注释 QT core gui #QT webengine…...

相亲交友中的用户画像构建方法探讨

随着互联网技术的发展&#xff0c;相亲交友平台成为现代人寻找伴侣的重要渠道之一。在这一过程中&#xff0c;如何精准地为用户推荐合适的对象成为了平台能否成功的关键。本文旨在探讨相亲交友平台中用户画像的构建方法&#xff0c;并分析其对于提高匹配度的重要性&#xff08;…...

总结

本来想把这个写完再写总结的&#xff0c;但是我发现卡了&#xff0c;明天去问问别人。 今天写上传个文件&#xff0c;没上传好&#xff0c;找到问题了&#xff0c;但是还不知道怎么改&#xff0c;我发给前端成功了&#xff0c;刚刚看了下好像是这里的问题&#xff0c;但是不是…...

C# 开发教程-入门基础

1.C# 简介、环境&#xff0c;程序结构 2.C# 基本语法&#xff0c;变量&#xff0c;控制局域&#xff0c;数据类型&#xff0c;类型转换 3.C# 数组、 循环&#xff0c;Linq 4.C# 类&#xff0c;封装&#xff0c;方法 5.C# 枚举、字符串 6.C# 面相对象&#xff0c;继承&#xff0…...

Windows上,使用远程桌面连接Ubuntu

要在 Ubuntu 上设置公网 IP 并通过 Windows 远程桌面连接到 Ubuntu&#xff0c;你需要完成以下步骤&#xff1a; 设置 Ubuntu 公网 IP&#xff1a; 确保你的 Ubuntu 服务器已经配置了一个公网 IP 地址。 你可以通过云服务提供商&#xff08;如 AWS、Azure、Google Cloud&#…...

SharePoint Online 计划 1 部署方案

概述 SharePoint Online 是 Microsoft 365 的一部分,为组织提供了一种高效、灵活的协作平台。SharePoint Online 计划 1(Plan 1)尤其适用于中小型企业,提供了基本的文档管理和协作功能。本文将详细介绍如何部署 SharePoint Online 计划 1,并探讨其配置、管理和最佳实践。…...

kubernetes存储之GlusterFS(GlusterFS for Kubernetes Storage)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

网络安全等保培训 ppt

网络安全等级保护怎么做&#xff1f;...

开关磁阻电机(SRM)系统的matlab性能仿真与分析

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 SRM的基本结构 4.2 SRM的电磁关系 4.3 SRM的输出力矩 5.完整工程文件 1.课题概述 开关磁阻电机(SRM)系统的matlab性能仿真与分析&#xff0c;对比平均转矩vs相电流&#xff0c;转矩脉动vs相电流&a…...

最新动态一致的文生视频大模型FancyVideo部署

FancyVideo是一个由360AI团队和中山大学联合开发并开源的视频生成模型。 FancyVideo的创新之处在于它能够实现帧特定的文本指导&#xff0c;使得生成的视频既动态又具有一致性。 FancyVideo模型通过精心设计的跨帧文本引导模块&#xff08;Cross-frame Textual Guidance Modu…...

茴香豆:企业级知识问答工具实践闯关任务

基础任务 在 InternStudio 中利用 Internlm2-7b 搭建标准版茴香豆知识助手&#xff0c;并使用 Gradio 界面完成 2 轮问答&#xff08;问题不可与教程重复&#xff0c;作业截图需包括 gradio 界面问题和茴香豆回答&#xff09;。知识库可根据根据自己工作、学习或感兴趣的内容调…...

英飞凌 PSoC6 RT-Thread 评估板简介

概述 2023年&#xff0c;英飞凌&#xff08;Infineon&#xff09;联合 RT-Thread 发布了一款 PSoC™ 62 with CAPSENSE™ evaluation kit 开发板 &#xff08;以下简称 PSoC 6 RTT 开发板&#xff09;&#xff0c;该开发套件默认内置 RT-Thread 物联网操作系统。PSoC 6 RTT 开…...

深度学习笔记(8)预训练模型

深度学习笔记&#xff08;8&#xff09;预训练模型 文章目录 深度学习笔记&#xff08;8&#xff09;预训练模型一、预训练模型构建一、微调模型&#xff0c;训练自己的数据1.导入数据集2.数据集处理方法3.完形填空训练 使用分词器将文本转换为模型的输入格式参数 return_tenso…...

C#事件的用法

前言 在C#中&#xff0c;事件&#xff08;Event&#xff09;可以实现当类内部发生某些特定的事情时&#xff0c;它可以通知其他类或对象。事件是基于委托&#xff08;Delegate&#xff09;的&#xff0c;委托是一种类型安全的函数指针&#xff0c;它定义了方法的类型&#xff…...