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

Neo4j数据库介绍及简单使用

图数据库介绍

图数据库是一种专门设计用于存储和管理图形数据的数据库类型。在图数据库中,数据以图的形式表示,其中节点表示实体,边表示实体之间的关系。这种表示方式非常适合处理具有复杂关系的数据,如社交网络、推荐系统、网络拓扑、生物信息学等领域的数据。
图数据库通常具有以下特点:

  1. 节点(Nodes): 表示图中的实体,每个节点都可以包含属性,用于描述实体的特征。
  2. 边(Edges): 表示图中节点之间的关系,边也可以包含属性,用于描述关系的特征。
  3. 图查询语言: 图数据库通常配有一种特定的查询语言,用于检索和操作图数据。Cypher是一个常见的图查询语言,用于Neo4j图数据库。
  4. 灵活的模型: 图数据库的数据模型非常灵活,可以轻松表示复杂的关系结构,而不需要预定义的模式。
  5. 性能优化: 图数据库在处理图形数据时具有高性能。由于它们专门设计用于处理节点和边之间的关系,因此在执行与图形相关的查询时通常能够提供较高的性能。

应用图数据库的场景包括:

  • 社交网络分析: 分析社交网络中的用户关系、群体结构等。
  • 推荐系统: 基于用户和物品之间的关系提供个性化的推荐。
  • 网络拓扑: 管理和分析复杂的网络结构,如计算机网络或交通网络。
  • 生物信息学: 分析基因、蛋白质和其他生物实体之间的关系。

图数据库的例子包括Neo4j、Amazon Neptune、ArangoDB等。这些数据库在处理具有复杂关系的数据时通常比传统的关系型数据库更有效。
为什么要使用图数据库:

在数据关系中心,图形数据库在查询速度方面非常高效,即使面对深度和复杂的查询也是如此。之前有人做了个实验,在一个社交网络找到最大深度为 4 的朋友的朋友,其中当深度为 4 的时候,图数据库的执行时间约为关系型数据库的 一千五百分之一,。

图数据库是以图结构存储和查询数据的数据库。在图数据库中,节点和关系取代表,外键和 Join。在图数据库中,无论何时运行类似 Join 的操作,数据库都会使用列表并直接访问链接的节点,而无需进行昂贵的搜索和匹配运算。
各个数据库的优劣点:

数据库类型数据类型优势劣势举例
键值数据库键值对简单、高性能不适用于复杂查询,没有内建查询语言Redis、DynamoDB、Riak
列存储数据库适用于大规模数据分析,压缩效果好,读取特定列的性能高不适合频繁更新操作Apache Cassandra、HBase、Bigtable
文档性数据库文档灵活,存储和查询复杂的数据结构,支持丰富的查询语言处理大量数据时性能可能不如专门优化的存储引擎MongoDB、CouchDB、Elasticsearch
图数据库节点和边高效处理复杂关系型数据,适用于网络分析、社交网络、推荐系统等不适合简单查询,对于关系不是核心的应用可能过于复杂Neo4j、ArangoDB、Amazon Neptune

Neo4j 介绍

Neo4j 是一种图数据库管理系统,专门设计用于存储和处理图形数据。主要有以下构建元素:

  • 节点:节点是图中的基本单元,用于表示实体。每个节点可以包含一个或多个属性,用于描述实体的特征。
  • 属性: 节点和关系可以包含属性,属性是键值对的形式,用于存储有关节点或关系的信息。属性提供了关于节点或关系的详细数据。
  • 关系:关系表示节点之间的连接或关联。它有一个方向,描述了连接的含义。关系也可以包含属性,用于描述关系的特征。
  • 标签:标签是用于将节点分组的一种方式。节点可以附加一个或多个标签,这样可以更轻松地对节点进行分类和检索。标签类似于节点的“类型”。
  • 数据浏览器: Neo4j提供了一个数据浏览器,是一个可视化工具,用于浏览和查询图数据库中的数据。通过数据浏览器,用户可以执行Cypher查询、可视化图形数据,并了解节点、关系和属性的结构。

Neo4j 使用场景:

Neo4j 常用于欺诈检测、实时推荐引擎。Neo4j常用于欺诈检测和实时推荐引擎等应用场景,这是因为Neo4j在处理复杂关系型数据方面具有优势。

Docker 安装 Neo4j

安装Neo4j可以通过Docker容器化来简化和隔离部署过程。以下是在Docker中安装Neo4j的一般步骤:

  1. 拉取Neo4j镜像: 打开终端(命令行)并运行以下命令来拉取Neo4j官方Docker镜像:
docker pull neo4j


这将从Docker Hub下载最新的Neo4j镜像。

  1. 运行Neo4j容器: 运行以下命令以在容器中启动Neo4j数据库。请注意,使用-p选项将Neo4j的HTTP端口映射到本地主机端口(例如,7474和7687):
docker run --name my-neo4j -e "NEO4J_AUTH=neo4j/123456" -p 7474:7474 -p 7687:7687 -d neo4j


这将在后台运行Neo4j容器,并将其命名为my-neo4j。你可以根据需要更改容器名称。

  1. 访问Neo4j浏览器: 一旦容器启动,你可以通过浏览器访问Neo4j浏览器。打开浏览器并访问 http://localhost:7474。默认的用户名为 neo4j,初始密码会在第一次访问时要求更改。
  2. 配置连接: 如果你的应用需要连接到Neo4j数据库,确保在应用中使用正确的Neo4j连接字符串(例如 bolt://localhost:7687)。
  3. 停止和删除容器: 如果你想停止Neo4j容器,可以运行以下命令:
docker stop my-neo4j

image.png
Neo4j 的 Cypher 语言是专门为处理图形数据而构建的,CQL 代表 Cypher 查询语言。像 Oracle 数据库具有查询语言 SQL,Neo4j 具有 CQL 作为查询语言。
对于 CQL 而言,它是一种声明性模式匹配语言,遵循 SQL 语法。

CQL 使用基础

简单的 CQL 命令及用法如下:

CQL 命令用法
CREATE创建节点
MATCH检索有关节点,关系和属性数据
RETURN返回查询结果
WHERE提供条件过滤检索数据
DELETE删除节点和关系
REMOVE删除节点和关系的属性
ORDER BY排序检索数据
SET添加或更新标签

创建节点(CREATE)

CREATE (n:Label {property1: value1, property2: value2, ...})
  • 示例:
CREATE (person:Person {name: 'John', age: 30})

创建关系(CREATE)

MATCH (node1:Label1), (node2:Label2)
WHERE node1.property = value1 AND node2.property = value2
CREATE (node1)-[:RELATIONSHIP_TYPE]->(node2)
  • 示例:
MATCH (john:Person {name: 'John'}), (jane:Person {name: 'Jane'})
CREATE (john)-[:KNOWS]->(jane)

查询节点和关系(MATCH)

MATCH (node:Label {property: value})-[:RELATIONSHIP_TYPE]->(relatedNode)
RETURN node, relatedNode
  • 示例:
MATCH (person:Person {name: 'John'})-[:KNOWS]->(friend)
RETURN person, friend

更新节点属性(SET)

MATCH (node:Label {property: value})
SET node.property = newValue
  • 示例:
MATCH (person:Person {name: 'John'})
SET person.age = 31

删除节点及其关系(DELETE)

MATCH (node:Label {property: value})-[relation:RELATIONSHIP_TYPE]->()
DELETE node, relation
  • 示例:
MATCH (person:Person {name: 'John'})-[relation:KNOWS]->()
DELETE person, relation

查询节点及其关系(RETURN)

MATCH (node:Label {property: value})-[:RELATIONSHIP_TYPE]->(relatedNode)
RETURN node, relatedNode
  • 示例:
MATCH (person:Person {name: 'John'})-[:KNOWS]->(friend)
RETURN person, friend

查询节点的属性(RETURN)

MATCH (node:Label {property: value})
RETURN node.property
  • 示例:
MATCH (person:Person {name: 'John'})
RETURN person.age

Go 语言创建 Neo4j 数据库

使用 Go 语言创建 Neo4j 数据库西游数据并写入 Neo4j 数据库中:

package mainimport ("fmt""github.com/neo4j/neo4j-go-driver/v4/neo4j""log"
)func main() {// Neo4j数据库连接信息neo4jURI := "bolt://43.143.147.135:27687"username := "username"password := "password"// 创建Neo4j数据库驱动driver, err := neo4j.NewDriver(neo4jURI, neo4j.BasicAuth(username, password, ""))if err != nil {log.Fatal(err)}defer driver.Close()// 创建Neo4j数据库会话session, err := driver.Session(neo4j.AccessModeWrite)if err != nil {log.Fatal(err)}defer session.Close()// 定义要写入的数据data := []string{`CREATE (tang:Character {NodeID: 1, Name: 'TangSeng', Title: '唐僧'})`,`CREATE (wukong:Character {NodeID: 2, Name: 'SunWukong', Title: '孙悟空'})`,`CREATE (bajie:Character {NodeID: 3, Name: 'ZhuBajie', Title: '猪八戒'})`,`CREATE (wujing:Character {NodeID: 4, Name: 'ShaWujing', Title: '沙悟净'})`,`CREATE (xitian:Place {NodeID: 5, Name: 'Xitian', Title: '西天'})`,`CREATE (journey:Task {NodeID: 6, Name: 'Journey', Title: '西天取经任务'})`,`MATCH (master:Character {Name: 'TangSeng'}),(student:Character {Name: 'SunWukong'}) CREATE (student)-[:MasterOf]->(master)`,`MATCH (master:Character {Name: 'TangSeng'}),(student:Character {Name: 'ZhuBajie'}) CREATE (student)-[:MasterOf]->(master)`,`MATCH (master:Character {Name: 'TangSeng'}),(student:Character {Name: 'ShaWujing'}) CREATE (student)-[:MasterOf]->(master)`,`MATCH (companion1:Character {Name: 'SunWukong'}),(companion2:Character {Name: 'ZhuBajie'}) CREATE (companion1)-[:CompanionOf]->(companion2)`,`MATCH (companion1:Character {Name: 'SunWukong'}),(companion2:Character {Name: 'ShaWujing'}) CREATE (companion1)-[:CompanionOf]->(companion2)`,`MATCH (character:Character {Name: 'SunWukong'}),(place:Place {Name: 'Xitian'}) CREATE (character)-[:TravelsTo]->(place)`,`MATCH (character:Character {Name: 'ZhuBajie'}),(place:Place {Name: 'Xitian'}) CREATE (character)-[:TravelsTo]->(place)`,`MATCH (character:Character {Name: 'ShaWujing'}),(place:Place {Name: 'Xitian'}) CREATE (character)-[:TravelsTo]->(place)`,`MATCH (place:Place {Name: 'Xitian'}),(task:Task {Name: 'Journey'}) CREATE (task)-[:MissionTo]->(place)`,}// 执行CQL命令for _, query := range data {result, err := session.Run(query, nil)if err != nil {log.Fatal(err)}// 输出查询结果fmt.Printf("Result: %+v\n", result)}
}

通过登录到 Neo4j 浏览器中可以发现成功写入数据:
image.png

  1. 创建新的关系,比如猪八戒和沙悟净曾是同事关系,具体数据库执行命令如下:
MATCH (n:Character {Name:"ZhuBajie"}),(m:Character {Name:"ShaWujing"}) Create (n)-[r:同事]->(m) return n.Name,type(r),m.Name

执行成功后,关系图谱增加了一条关系,当执行两次后,关系图谱会增加两条相同的关系:
image.png

  1. 当关系增加多了之后,要删除多余的关系,具体命令如下:
MATCH (n:Character {Name:"ZhuBajie"})-[relation:同事]->()
WITH relation LIMIT 1
DELETE relation

成功执行后关系恢复正常关系。
image.png

  1. 当人员出现变动后,比如孙悟空三打白骨精后被赶回花果山,公司架构出现问题,要三处孙悟空的人物关系,首先是不能直接删除节点的,以为他具备关系,因此具体的命令如下:
MATCH (n:Character{Name:"SunWukong"})-[r]->(m) delete r return Type(r)
MATCH (n:Character{Name:"SunWukong"}) Delete (n)

执行完成后人物图谱关系如下图所示:
image.png

  1. 当孙悟空离开西游团队后,团队进入了新的员工六耳猕猴,唐僧作为它的Master,猪八戒作为它的同事,新的节点及关系添加的具体命令如下:
CREATE (tang:Character {NodeID: 6, Name: '六耳猕猴', Title: '六耳猕猴'})
MATCH (master:Character {Name: 'TangSeng'}),(student:Character {Name: '六耳猕猴'}) CREATE (student)-[:MasterOf]->(master)
MATCH (companion1:Character {Name: '六耳猕猴'}),(companion2:Character {Name: 'ZhuBajie'}) CREATE (companion1)-[:CompanionOf]->(companion2)

执行完成后新的团队组织关系如下:
image.png
总结:以上是Neo4j的简单增删改查,对于熟练掌握Neo4j数据库来说还有很长的路要走和分析,后续需要在项目中不断学习和锤炼自己。

相关文章:

Neo4j数据库介绍及简单使用

图数据库介绍 图数据库是一种专门设计用于存储和管理图形数据的数据库类型。在图数据库中,数据以图的形式表示,其中节点表示实体,边表示实体之间的关系。这种表示方式非常适合处理具有复杂关系的数据,如社交网络、推荐系统、网络…...

ubuntu 20.04安装 Anaconda教程

在安装Anaconda之前需要先安装ros(防止跟conda冲突,先装ros)。提前安装好cuda 和cudnn。 本博客参考:ubuntu20.04配置ros noetic和cuda,cudnn,anaconda,pytorch深度学习的环境 安装完conda后,输入: pyth…...

iframe渲染后端接口文件和实现下载功能

一:什么是iframe? 1、介绍 iframe 是HTML 中的一种标签,全称为 Inline Frame,即内联框架。它可以在网页中嵌入其他页面或文档,将其他页面的内容以框架的形式展示在当前页面中。iframe的使用方式是通过在HTML文档中插入…...

广西建筑工地模板:支模九层桉木模板

广西作为中国西南地区的重要建筑市场,建设工地的模板需求量一直居高不下。在众多建筑模板中,支模九层桉木模板以其强度高、使用寿命长的特点而备受关注。本文将介绍广西建筑工地常用的支模九层桉木模板,并探讨其在建筑施工中的应用优势。支模…...

java集合,栈

只有栈是类 列表是个接口 栈是个类 队列 接口有双链表,优先队列(堆) add会报错 offer是一个满了不会报错 set集合 有两个类实现了这个接口...

Ubuntu 20.04 LTS ffmpeg gif mp4 互转 许编译安装ffmpeg ;解决gif转mp4转换后无法播放问题

安装ffmpeg apt install ffmpeg -y gif转mp4 ffmpeg -f gif -i ldh.gif ldh.mp4 故障:生成没报错,但mp4无法播放,体积也不正常 尝试编译安装最新版 sudo apt install -y yasm axel -n 100 https://ffmpeg.org/releases/ffmpeg-6.0.1.tar.x…...

【Nginx】使用nginx进行反向代理与负载均衡

使用场景 反向代理:一个网站由许多服务器承载的,网站只暴露一个域名,那么这个域名指向一个代理服务器ip,然后由这台代理服务器转发请求到网站负载的多台服务器中的一台处理。这就需要用到Nginx的反向代理实现了 负载均衡&#xf…...

基于IDEA 进行Maven依赖管理

1. 依赖管理概念 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等…...

瑞萨RZ/G2L平台 初起动(SD卡启动)

文章目录 一 准备条件1 工具2 硬件3 镜像 二 烧录SD卡启动盘三 写Bootloader1 烧录文件2 启动烧录3 烧录 四 启动设置 一 准备条件 1 工具 ** BalenaEtcher(俗称“ Etcher”),是一款快速将系统镜像文件( .iso 或 .img 或 .zip或…...

chkconfig及服务脚本

运行级别 linux启动之后处于某个状态 linux运行级别 0:关机 #设置即重启 1:单用户,为root权限,禁止远程登录 2:无网络文本模式 3:多用户文本模式 4:未使用 5:图形化…...

[Android] libcutils - native 获取/设置 property

前言: Android 的property系统类似于linux的环境变量,但是更加精细。可以通过adb 设置和读取 property,同时也可以在代码 (JAVA/C/C) 中设置和获取属性。这有助于我们在运行时控制代码执行逻辑。比如打开 测试开关 或者 dump源数据文件。 工…...

Matlab 方位角计算之二

文章目录 一、简介二、实现代码三、实现效果一、简介 我们总是说降维打击,这种思路尤其在一些问题上显现的尤为突出,就比如方位角这个问题,如果我们局限于二维这个空间,那么很多时候就需要判断方向向量落在了那个象限,之后再一个个情况逐一分析,虽然这样做并不复杂,但总…...

Postman工具简介

介绍 Postman是一个商业的接口测试工具。免费的版本也可以使用不少功能。 官网:https://www.postman.com/ 下载、安装、应用界面 下载 安装、安装成功以后的应用界面 双击下载下来的可执行文件进行安装,出现如下界面: 可以注册一个账…...

2023.11.17 -hivesql调优,数据压缩,数据存储

目录 1.hive命令和参数配置 2.hive数据压缩 3.hive数据存储 0.原文件大小 18.1MB 1.textfile行存储格式, 压缩后size:18MB 2.行存储格式:squencefile ,压缩后大小8.89MB​ 3. 列存储格式 orc - ZILIB ,压缩后大小2.78MB 4.列存储格式 orc-snappy ,压缩后大小3.75MB 5…...

基于Vue+SpringBoot的大学计算机课程管理平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…...

2.c++基础语法

文章目录 1.c 程序结构关键字标识符、操作符、标点预处理指令注释main 主函数命名空间 2.c 变量和常量变量 3.c 数组和容器4.c 程序流程5.c字符和字符串 1.c 程序结构 关键字 关键字事程序保留的,程序员不能使用,c的常见关键字如下图: 标识…...

applicationContext.getBean 为null

场景: 使用SpringUtils 添加了统一类的调用。单元测试是正常的。 SpringUtils public class SpringUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;Overridepublic void setApplicationContext(Nonnull Applica…...

无线WiFi安全渗透与攻防(六)之WEP破解-Gerix-wifi-cracker自动化破解WEP加密

WEP破解-Gerix-wifi-cracker自动化破解WEP加密 WEP破解-Gerix-wifi-cracker自动化破解WEP加密1.环境准备1.软件和kali2.下载软件,下载地址3.将软件复制到kali,解压4.进入软件目录2.破解步骤1.启动gerix-wifi-cracker-2-master软件2.设置无线网卡位Monitor Mode模式3.重新扫描…...

华为OD机试 - 环中最长子串(Java JS Python C)

题目描述 给你一个字符串 s,首尾相连成一个环形,请你在环中找出 o 字符出现了偶数次最长子字符串的长度。 输入描述 输入是一个小写字母组成的字符串 输出描述 输出是一个整数 备注 1 ≤ s.length ≤ 500000s 只包含小写英文字母用例 输入alolobo输出6说明最长子字符串之一…...

bug-跨域访问问题

问题场景 自定义 header,导致跨域问题 一个大屏项目,设置请求接口获取数据时,有的接口能够正常返回数据,有的接口提示跨域(接口域名不同),后端也进行支持跨域设置,结果还是提示跨域…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...

免费批量Markdown转Word工具

免费批量Markdown转Word工具 一款简单易用的批量Markdown文档转换工具&#xff0c;支持将多个Markdown文件一键转换为Word文档。完全免费&#xff0c;无需安装&#xff0c;解压即用&#xff01; 官方网站 访问官方展示页面了解更多信息&#xff1a;http://mutou888.com/pro…...