Neo4j数据库介绍及简单使用

news2024/11/14 14:55:46

图数据库介绍

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

  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 main

import (
	"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.coloradmin.cn/o/1212333.html

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

相关文章

安装部署PowerDNS--实现内网DNS解析(use)

使用PowerDNS实现内网DNS解析_powerdns-admin-CSDN博客 https://www.cnblogs.com/guangdelw/p/17348982.html 一、概念介绍 PowerDNS是一个域名解析服务,官网提供了三个组件:Authoritative、Recursor、dnsdist,分别用来作为权威服务器、域名递…

Leetcode——岛屿的最大面积

1. 题目链接:695. 岛屿的最大面积 2. 题目描述: 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都…

ssh脚本找不到命令或者执行无效的解决办法

如图:今天在编写脚本时发现的这个问题, 在排除脚本语法错误、编码格式等情况下,仍然出现“bash 。。未找到命令”的字样 解决办法: 给每台虚拟机的环境变量source一下: 命令如下 source /etc/profile或者输入 vim ~…

【数据结构】直接选择排序(你知道最不常用的排序算法有哪些吗?)

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

【2023云栖】黄博远:阿里云人工智能平台PAI年度发布

本文根据2023云栖大会演讲实录整理而成,演讲信息如下: 演讲人:黄博远 | 阿里云计算平台事业部资深产品专家、阿里云人工智能平台PAI产品负责人 演讲主题:阿里云人工智能平台PAI年度发布 AIGC是我们这个时代的新机遇 今年云栖大…

单相过压继电器DVR-G-100-1 0~500V AC/DC220V 导轨安装

系列型号 DVR-G-100-1X3数字式过压继电器; DVR-G-100-3三相过压继电器; DVR(H)-G-100-1单相过压继电器; DVR-Q-100-3三相欠压继电器; DVR(H)-Q-100-3三相欠压继电器 一、用途 主要应用于电机、变压器等主设备以及输配电系统的继…

人工智能与大数据:驱动现代业务转型的双引擎

在当今数字化时代,人工智能(AI)和大数据已成为驱动业务和技术创新的关键力量。它们的结合不仅重塑了传统行业,也催生了新的商业模式和服务方式。 AI与大数据在零售行业的应用 在零售行业,AI和大数据的应用已经成为提…

代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和

LeetCode T1143 最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣(LeetCode) 题目思路: 动规五部曲分析 1.确定dp数组的含义 这里dp数组的含义是结尾分别为i-1,j-1的text1和text2的最长公共子序列长度 至于为什么是i-1,j-1我之前已经说过了,这里再…

电池故障估计:Realistic fault detection of li-ion battery via dynamical deep learning

昇科能源、清华大学欧阳明高院士团队等的最新研究成果《动态深度学习实现锂离子电池异常检测》,用已经处理的整车充电段数据,分析车辆当前或近期是否存在故障。 思想步骤: 用正常电池的充电片段数据构造训练集,用如下的方式构造…

重生奇迹mu圣导师加点

重生奇迹mu圣导师加点:要攻击高可以加力量,平衡系建议加点力量600~800,智力200~400,敏够装备要求,统帅1000,其余加体力。 圣导师靠加力量培养高攻圣导师不现实,建议玩家练魔,低级圣…

【随手记录】Llama Tutorial 大语言模型实践 手把手系列带实践源码

这个tutorial的契机是yy突然看到了一个workshop 所以类似于一周大作业的形式,输入command输出使用了自动驾驶哪些模块,代码在这里 所以就干一干,顺便写一个tutorial给大家参考和教程 引申更多的应用 参考资料: https://github.c…

【软考篇】中级软件设计师 第三部分(二)

中级软件设计师 第三部分(二) 二十四. 概念设计阶段24.1 E-R模式24.2 E-R图 二十五. 网络和多媒体25.1 计算机网络分类25.2 OSI/RM参考模型25.3 网络互联硬件25.4 TCP/IP分层模型 二十六. IP地址26.1 子网划分26.2 特殊IP26.3 IPv626.4 冲突与和广播域26…

使用html2canvas插件进行页面截屏

使用纯html实现过程 <!DOCTYPE html> <html><head><title>使用html2canvas生成网页截图</title><script src"https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script> </head><body><h1>…

jQuery使用echarts循环插入图表

目录 jQuery动态循环插入echarts图表 y轴显示最大值和最小值 x轴只显示两个值&#xff0c;开始日期和结束日期 jQuery动态循环插入echarts图表 html .center_img_list 是我们循环数据的地方 <div class"center_img shadow"><div class"center_img_b…

python_pycharm安装与jihuo

目录 环境&#xff1a; 安装包与jihuo文件&#xff1a; 安装python3.8.10 安装pycharm jihuo pycharm 概述 过程 jihuo 相关文件 环境&#xff1a; window11 python3.8.10 pycharm-professional-2019.1.3 安装包与jihuo文件&#xff1a; 安装python3.8.10 安装pyc…

算法通关村——归并排序

归并排序 1、归并排序原理 ​ 归并排序是一种很经典的分治策略。 ​ 归并排序(MERGE-SORT)简单来说就是将大的序列先视为若干小的数组&#xff0c;分成几个比较小的结构&#xff0c;然后是利用归并的思想实现的排序方法。将一个大的问题分解成一些小的问题分别求解&#xff…

mask-rcnn原理与实战

一、Mask R-CNN是什么&#xff0c;可以做哪些任务&#xff1f; Mask R-CNN是一个实例分割&#xff08;Instance segmentation&#xff09;算法&#xff0c;可以用来做“目标检测”、“目标实例分割”、“目标关键点检测”。 1. 实例分割&#xff08;Instance segmentation&am…

pipeline + node +jenkins+kubernetes部署yarn前端项目

1、编写Dockerfile文件 # Set the base image FROM node:16.10.0# WORKDIR /usr/src/app/ WORKDIR /home/option# Copy files COPY ./ /home/option/# Build arguments LABEL branch${BRANCH} LABEL commit${COMMIT} LABEL date${BUILD_DATE} ARG ENV# Set ENV variables ENV …

Python循环的技巧和注意事项

在Python中&#xff0c;主要使用for循环和while循环进行迭代。为了更有效的使用循环&#xff0c;避免一些常见的陷阱&#xff0c;总结了一些关于使用循环的注意事项。 1. 避免无限循环 在while循环中&#xff0c;程序会一直执行循环体&#xff0c;直到条件不再满足&#xff0c…

2023年05月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有列表L=[‘UK’,‘china’,‘lili’,“张三”],print(L[-2])的结果是?( ) A: UK B: ‘lili’,‘张三’ C: lili D: ‘UK’,‘china’,‘lili’ 答案:C 列表元素定位 第2题 …