Neo4j 图数据库入门
图形数据库存储节点和关系,而不是表或文档。数据的存储方式就像你在白板上勾画想法一样。您的数据存储不受预定义模型的限制,允许以非常灵活的方式考虑和使用它。

一、核心概念:属性图形模型
Neo4j使用属性图数据库模型。图数据结构由节点(离散对象)组成,它们可以通过关系连接起来。属性图数据库模型包括:
- 节点(node):描述领域实体(离散对象)。
- 标签(label):节点可以有零个或多个标签来定义(分类)它们是什么类型的节点。由于标签可以在运行时添加和删除,因此它们也可以用于标记节点的临时状态。
- 关系(relationship):描述源节点和目标节点之间的连接关系,也可关联自身。关系将节点组织成结构,允许图类似于列表、树、地图或复合实体——其中任何一种都可以组合成更复杂、更丰富的相互连接的结构。
- 方向(direction):关系有一个方向。只包含一个节点的路径长度为0。
- 类型(type):关系必须有一个类型(一种类型)来定义(分类)它们是什么类型的关系。
- 属性(properties):节点和关系可以具有属性(键值对),这些属性可以进一步描述它们。

对应:
CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})-[:ACTED_IN {roles: ['Forrest']}]->(:Movie {title: 'Forrest Gump', released: 1994})<-[:DIRECTED]-(:Person {name: 'Robert Zemeckis', born: 1951})
二、遍历和路径
遍历是指为了找到问题的答案而查询图表的方式,例如:“我的朋友喜欢什么我还没有的音乐?”或者“如果电源坏了,什么网络服务会受到影响?”
遍历一个图意味着按照一定的规则遵循关系来访问节点。在大多数情况下,只访问图的一个子集。
例如:为了找出汤姆·汉克斯演过哪些电影,遍历将从 Tom Hanks 节点开始,遵循连接到该节点的任何 ACTED_IN 关系,最终得到 Movie 节点《阿甘正传》。

三、Schema
Neo4j 中的模式指的是索引和约束。Neo4j 通常被描述为模式可选,这意味着它不需要创建索引和约束。您可以创建数据(节点、关系和属性)而无需预先定义模式。可以在需要时引入索引和约束,以获得性能或建模方面的好处。
四、命名约定
| Graph entity | Recommended style | Example |
|---|---|---|
| Node label | Camel case, beginning with an upper-case character | :VehicleOwner rather than :vehicle_owner |
| Relationship type | Upper case, using underscore to separate words | :OWNS_VEHICLE rather than :ownsVehicle |
| Property | Lower camel case, beginning with a lower-case character | firstName rather than first_name |
五、数据建模
Property vs relationship
与任何数据库一样,您设计的数据模型对于确定查询的逻辑和存储中的数据结构非常重要。没有最好的数据模型,是否“最佳”取决于您打算对数据运行的查询类型。对数据建模没有正确或错误的方法。有些方法可能更适合您的需求,并且在您优先考虑的方面性能更好。

Time-bound data and versioning
例如,如果您希望在某人与其当前地址之间创建一个新的有效日期关系,但同时保留过去的地址,则可以使用在关系类型中包含日期的相同原则

有时,您可能会发现一个模型非常适合您需要的某个场景,但另一个模型更适合其他场景。例如,一些模型在写查询方面表现更好,而其他模型在读查询方面表现更好。这两种功能对您的用例都很重要,那么您该怎么做呢?
在这些情况下,您可以结合使用这两种模型,并利用各自的优点。是的,您可以在图中使用多个数据模型!
六、关系型转为图模型
- 表对应节点标签:关系模型中的每个实体表都成为图模型中节点上的标签。
- 行对应节点:关系实体表中的每一行都成为图中的一个节点。
- 列对应节点属性:关系表上的列(字段)成为图中的节点属性。
- 仅业务主键:删除技术主键,保留业务主键。
- 添加约束/索引:为业务主键添加唯一约束,为频繁查找属性添加索引。
- 关系的外键-用关系替换其他表的外键,然后删除它们。
- 无默认值:删除具有默认值的数据,无需存储这些数据。
- 清理数据:非规范化表中的重复数据可能必须被拉出到单独的节点中,以获得更干净的模型。
- 索引列到数组:索引列名(如email1、email2、email3)可能表示数组属性。
- 将表连接到关系:将连接表转换为关系,这些表上的列成为关系属性

七、图模型建模技巧
要找到适合您需求的最佳数据模型,通常可以使用一些技术并根据分析做出数据模型决策。
首先编写查询
了解要对数据提出的问题和查询类型是确定数据模型结构的好方法。如果您知道查询需要返回某个日期范围内的结果,那么您可能应该确保date不是节点上的属性,而是作为单独的节点或关系存储。
查询按优先级排序
您应该确定哪种模型最适合您的需求。您可能无法在每个查询上最大化性能,但是您可能能够在使用某些资源、时间和代码的情况下最大限度地利用系统。要做到这一点,您需要决定哪些查询必须绝对具有最大性能,哪些功能对于提供价值至关重要。这可能是一个艰难的决定,但无论您使用的是哪种技术,这些决定都会在某些方面存在。使Neo4j更有价值的是,该模型是灵活的,如果您的优先级随着时间的推移而调整,它可以改变。
测试,找到答案的最好方法是用真实数据进行测试
重构模型
根据不断变化的需求随时调整您的图模型。
- 导入 csv 原始航班数据
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/neo4j-contrib/training/master/modeling/data/flights_1k.csv" AS row
MERGE (origin:Airport {code: row.Origin})
MERGE (destination:Airport {code: row.Dest})
MERGE (origin)-[connection:CONNECTED_TO {airline: row.UniqueCarrier,flightNumber: row.FlightNum,date: date({year: toInteger(row.Year), month: toInteger(row.Month), day: toInteger(row.DayofMonth)}),cancelled: row.Cancelled,diverted: row.Diverted}]->(destination)
ON CREATE SET connection.departure = localtime(apoc.text.lpad(row.CRSDepTime, 4, "0")),connection.arrival = localtime(apoc.text.lpad(row.CRSArrTime, 4, "0"))
- 修改属性类型
MATCH (:Airport)-[connectedTo:CONNECTED_TO]->(:Airport)
CALL apoc.refactor.normalizeAsBoolean(connectedTo, "diverted", ["1"], ["0"])
RETURN count(*)
- 从关系改为节点

该查询使用了apoc.periodic.iterate,这样您就可以分批地进行重构,而不是在单个事务中进行重构,防止数据量过大时内存溢出。
CALL apoc.periodic.iterate("MATCH (origin:Airport)-[connected:CONNECTED_TO]->(destination:Airport) RETURN origin, connected, destination","CREATE (flight:Flight {date: connected.date,airline: connected.airline,number: connected.flightNumber,departure: connected.departure,arrival: connected.arrival,cancelled: connected.cancelled,diverted: connected.diverted})MERGE (origin)<-[:ORIGIN]-(flight)MERGE (flight)-[:DESTINATION]->(destination)DELETE connected",{batchSize: 100})
- 从属性创建节点
目前,航空公司名称存储在 Flight 节点的 airline 属性中。这意味着,如果您想返回所有航空公司,则必须扫描每个航班并检查每个航班的航空公司属性,可以将该属性转为一个节点类型,方便查找。
CALL apoc.periodic.iterate('MATCH (flight:Flight) RETURN flight','MERGE (airline:Airline {name:flight.airline})MERGE (flight)-[:AIRLINE]->(airline)REMOVE flight.airline',{batchSize:10000, iterateList:true, parallel:false}
)
八、工具
Arrows.app
一个基于 web 的可视化建模工具。https://neo4j.com/labs/arrows/

Neo4j Data Importer
允许您从 .csv 文件导入数据,而无需使用任何代码。这意味着您可以从任何可以导出到 .csv 文件的数据源导入数据。
https://neo4j.com/docs/data-importer/current/
Neo4j Data Importer
允许您从 .csv 文件导入数据,而无需使用任何代码。这意味着您可以从任何可以导出到 .csv 文件的数据源导入数据。
https://neo4j.com/docs/data-importer/current/
欢迎联系
如果这篇文章对您有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢您的细心阅读,如果发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理
^_^
相关文章:
Neo4j 图数据库入门
图形数据库存储节点和关系,而不是表或文档。数据的存储方式就像你在白板上勾画想法一样。您的数据存储不受预定义模型的限制,允许以非常灵活的方式考虑和使用它。 一、核心概念:属性图形模型 Neo4j使用属性图数据库模型。图数据结构由节点(离…...
linux 磁盘满了,程序运行失败,如何处理?df -h
场景:紧急呼救,上传图片失败了。我一脸懵,服务器这是又咋地了,别邪乎姐姐,姐姐胆子小啊。 一、寻找问题原因 1、OSS出问题了? 然后我尝试了 IOS 的APP是没问题的,Android提示上传失败…...
Python编码系列—前端后浪:Python前后端分离开发实战指南
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
Docker学习之路【五】了解数据卷
定义与特性 Docker数据卷是一个特殊目录,,用于实现容器间数据的持久化和共享。数据卷存在于宿主机上,可以被一个或多个容器使用。它独立于容器的生命周期,意味着即使容器被删除,数据卷中的数据也会保留。数据卷的主要…...
matlab如何设置产生的随机数一致
在MATLAB中,确保产生的随机数序列一致,通常需要使用随机数生成器的种子(seed)。通过设置相同的种子值,可以确保在每次运行代码时,随机数生成器从相同的初始状态开始,从而生成相同的随机数序列。…...
ansible --------拓展
编辑 hosts 配置文件 [rootmo ~]# vim /etc/ansible/hosts # 创建目录 [rootmo ~]# mkdir /etc/ansible/playbook # 编辑配置文件 [rootmo ~]# vim /etc/ansible/playbook/nginx.yml # 执行测试 [rootmo ~]# ansible-playbook /etc/ansible/playbook/nginx.yml roles 修…...
gazebo下使用Fast-planner配置(包含mpc局部规划+控制Gazebo小车以及FastPlanner配置)
源码链接: https://github.com/USE-jx/NMPC_CASADI_CPP?tabreadme-ov-file #这是NMPC的 里面有Fast-Planner,但编译可能缺少东西,所以再放一个Fast-Planner的,可以装装缺少的库 https://github.com/HKUST-Aerial-Robotics/Fast-P…...
Python核心编程--Python要点总结
Python 核心编程包括了一些关键的要点,理解这些要点对于掌握 Python 至关重要。以下是 Python 核心编程的一些要点: 1. 数据类型与数据结构 基本数据类型: int, float, str, bool容器类型: list, tuple, set, dict不可变类型与可变类型: tuple 是不可变…...
【mysql】mysql配置文件之优先级学习
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
自然语言处理(NLP)大模型
自然语言处理(NLP)大模型 自然语言处理(NLP)领域中的一种重要技术,具有强大的语言理解和生成能力。以下是对NLP大模型的详细介绍: 一、定义与背景 NLP大模型是指通过大规模预训练和自监督学习技术构建的…...
融合创新趋势:Web3时代的跨界融合
随着互联网技术的飞速发展,Web3时代的到来正引领着一场深刻的技术与社会变革。Web3,作为下一代互联网技术的代表,不仅仅是一种技术创新,更是一种跨界融合的趋势。通过去中心化、智能合约和区块链技术的应用,Web3正在重…...
面临新时代的机遇与挑战,联想凌拓将如何破局?
近年来,IT行业的技术进步日新月异,云计算、大数据、人工智能……各种新兴技术犹如雨后春笋般层出不穷,并且正在给千行百业带来全面的变革甚至重塑。 然而以上提到的所有新兴技术,都离不开数据的存储与管理。那么作为中国乃至全球领…...
2024.8.21
作业: 运行1个服务器和2个客户端 实现效果: 服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接,2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视服务器是否发来…...
在Ubuntu16.04里安装ROS Kinetic
1.设置apt的source list sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu$(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list 2.设置gpd keys sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365…...
后端开发刷题 | 合并两个排序的链表
描述 输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围: 0≤n≤1000,−1000≤节点值≤1000 如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},…...
JAVA_7
JAVA_7 JAVA面向对象编程1. 抽象方法和抽象类 JAVA面向对象编程 1. 抽象方法和抽象类 使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。包含抽象方法的类就是抽象类。通过…...
最大连续1的个数 III(LeetCode)
题目 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 解题 def longestOnes(nums, k):left 0max_len 0zero_count 0for right in range(len(nums)):# 如果遇到0,统计当前窗口内0的个…...
Vue之前端批量下载文件并以压缩包形式存储
后端返回一个文件链接的数组,前端处理下载逻辑,并且将这些文件存储在压缩包内部,这用的jszip 和 file-saver 这两个库。 步骤说明 1.使用 npm 或 yarn 安装 jszip 和 file-saver。 npm install jszip file-saver 2.获取文件内容:…...
【AI学习】LLaMA模型的微调成本有几何?
在前面文章《LLaMA 系列模型的进化(二)》中提到了Stanford Alpaca模型。 Stanford Alpaca 基于LLaMA (7B) 进行微调,通过使用 Self-Instruct 方法借助大语言模型进行自动化的指令生成,Stanford Alpaca 生成了 52K 条指令遵循样例数…...
【专题】2024全数驱动 致胜未来-数字化敏捷银行白皮书报告合集PDF分享(附原数据表)
原文链接: https://tecdat.cn/?p37404 政策明确发展使命,新时代商业银行应坚持党建引领,秉持高质量发展理念。数字经济已成大势,商业银行需构建数字基础设施能力,强化顶层战略规划。当前商业银行数字化发展面临诸多挑…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
