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数据库来说还有很长的路要走和分析,后续需要在项目中不断学习和锤炼自己。

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

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

相关文章

vuekeyclock 集成

前端集成keycloak鉴权的主要写法, 在main.js里面写 import VueKeycloakJs from dsb-norge/vue-keycloak-js import { KeycloakInstance } from "keycloak-js";// 回调地址 const pageIndex process.env.NODE_ENV production ? http://xxxx/#/ : http:…

2023数据结构期中测验-2023秋-计算机+未来网络专业

数据结构期中测验 选择题函数题6-1 求链式表的表长6-2 逆序数据建立链表6-3 删除单链表偶数节点6-4 求二叉树高度6-5 先序输出叶结点 为了防止不自觉的朝答案看去,特意用了浅色字体 选择题 2-1 下述程序段的时间复杂度为( ) for&#xff0…

LightDB23.4 支持双引号+字段名大写兼容oracle数据库

背景介绍 由于Oracle数据库默认是将列名以大写的形式存储的,LightDB数据库默认以小写的形式存储列名,为了兼容Oracle数据库的SQL语句,LightDB23.4版本支持双引号字段名大写来操作以小写形式存储的列名。这个功能仅在Oracle兼容模式下生效&am…

Edge最新版本,关闭侧边栏,不需命令,更改设置就可

边栏展示 说明:Edge自动更新版本后(版本 119.0.2151.58),出现了侧边栏,看着很不舒服,效果如上图 修改: 1、在设置找到侧栏 2、点击Copilot后,展示的页面中会有始终显示边栏这一开…

《洛谷深入浅出进阶篇》P3397 地毯————二维差分

上链接:P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3397 上题干: 题目描述 在 nn 的格子上有 m 个地毯。 给出这些地毯的信息,问每个点被多少个地毯覆盖。 输入格式 第一行,两个…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…

业务连续性:确保稳健运营的关键战略

在今天的快节奏商业环境中,保障业务连续性是企业成功的重要保障。业务连续性不仅仅是关于应对自然灾害或技术故障,更是一项战略,涉及组织的整体准备、规划和应对能力,以确保在各种情况下业务的稳健运营。 一、业务连续性的定义 业…

常见希腊字母

大写希腊字母 LaTeX表示 A A l p h a B B e t a Γ G a m m a Δ D e l t a E E p s i l o n Z Z e t a H E t a Θ T h e t a I I o t a K K a p p a Λ L a m b d a M M u N N u Ξ X i O O m i c r o n Π P i P R h o Σ S i g m a T T a u Υ U p s i l o n Φ P h i X C …

Docker - 企业项目

Docker - 企业项目 因为环境原因,本章本人没有实际操作,以理论为主 容器单独没有什么意义,有意义的是容器的编排 Docker 4台:1核2G的ECS K8s 9台:2核4G的ECS Docker Compose Docker Swarm # manager节点初始化sw…

【C++11】线程库

文章目录 thread 线程库mutex 锁atomic 原子性操作condition_variable 条件变量实现两个线程交替打印1-100 thread 线程库 在C11之前,涉及到多线程问题,都是和平台相关的,比如Windows和Linux下各有自己的接口,这使得代码的可移植…

(Matalb时序预测)GWO-BP灰狼算法优化BP神经网络的多维时序回归预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分代码展示: 四、完整代码数据说明手册下载: 一、程序及算法内容介绍: 基本内容: 本代码基于M…

NC65 消息弹框提示和状态栏提示以及其他方式的输出或抛出

弹框提示:nc.ui.pub.beans.MessageDialog 用于显示状态栏提示信息:nc.ui.uif2.ShowStatusBarMsgUtil nc.ui.uif2.DefaultExceptionHanler exceptionHanler new nc.ui.uif2.DefaultExceptionHanler(); exceptionHanler.setContext(ctx); // 重置错误类…

01:2440----点灯大师

目录 一:点亮一个LED 1:原理图 2:寄存器 3:2440的框架和启动过程 A:框架 B:启动过程 4:代码 5:ARM知识补充 6:c语言和汇编的应用 A:代码 B:分析汇编语言 C:内存空间 7:内部机制 二:点亮2个灯 三:流水灯 四:按键控制LED 1:原理图 2:寄存器配置 3:代码 一:点…

xss总结

xss注入总结 漏洞描述 XSS(跨站脚本攻击)是一种常见的网络安全漏洞,攻击者利用该漏洞在网页中插入恶意脚本,以获取用户的敏感信息或执行恶意操作。 XSS中文叫做跨站脚本攻击(Cross-site scripting)&…

DNS服务器典型配置

文章目录 安装主程序bind和安全插件bind-root修改主配置文件/etc/named.conf正向解析 安装主程序bind和安全插件bind-root yum install bind-chroot修改主配置文件/etc/named.conf vim /etc/named.conf将listen-on和allow-query的ip或域名换成any 表示为服务器所有的IP地址启…

Java开发中解决紧耦合的方法有哪些?

Java开发中解决紧耦合的方法有哪些? 文章目录 Java开发中解决紧耦合的方法有哪些?一、基本说明二、代码演示1、使用接口(Interface)2、依赖注入(Dependency Injection)3、设计模式4、模块化5、服务层&#…

【Android】在使用约束布局(ConstraintLayout)中,当某个子View发生隐藏后,某个View无法正确显示了

问题背景 在使用约束布局(ConstraintLayout)中,当某个子View发生隐藏后,某个View无法正确显示了。 问题分析 比如说是一个TextView文本内容无法显示。可能你发现setText方法很明显调用了,但是就是无法显示。而你通过…

人工智能时代,应如何保护个人信息

文章目录 人工智能时代保护个人信息的对策1.企业行为规制第一,透明性。第二,针对生物识别信息的特别同意。第三,匿名化。第四,个人信息本地化。 2.政府部门行为规范第一,以必要性为前提。第二,以最小数据量…

http1.0、1.1、2.0、3.0

HTTP协议: HTTP 是 HyperText Transfer Protocol(超文本传输协议)的缩写,它是互联网上应用最为广泛的一种网络协议,所有 WWW 文件都必须遵守这个标准。 HTTP1.0版本:功能: 请求中新增协…