Neo4j 图数据库入门

news2024/11/25 22:58:37

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

在这里插入图片描述

一、核心概念:属性图形模型

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 entityRecommended styleExample
Node labelCamel case, beginning with an upper-case character:VehicleOwner rather than :vehicle_owner
Relationship typeUpper case, using underscore to separate words:OWNS_VEHICLE rather than :ownsVehicle
PropertyLower camel case, beginning with a lower-case characterfirstName rather than first_name

五、数据建模

Property vs relationship

与任何数据库一样,您设计的数据模型对于确定查询的逻辑和存储中的数据结构非常重要。没有最好的数据模型,是否“最佳”取决于您打算对数据运行的查询类型。对数据建模没有正确或错误的方法。有些方法可能更适合您的需求,并且在您优先考虑的方面性能更好。

在这里插入图片描述

Time-bound data and versioning

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

在这里插入图片描述

有时,您可能会发现一个模型非常适合您需要的某个场景,但另一个模型更适合其他场景。例如,一些模型在写查询方面表现更好,而其他模型在读查询方面表现更好。这两种功能对您的用例都很重要,那么您该怎么做呢?
在这些情况下,您可以结合使用这两种模型,并利用各自的优点。是的,您可以在图中使用多个数据模型!

六、关系型转为图模型

  1. 表对应节点标签:关系模型中的每个实体表都成为图模型中节点上的标签。
  2. 行对应节点:关系实体表中的每一行都成为图中的一个节点。
  3. 列对应节点属性:关系表上的列(字段)成为图中的节点属性。
  4. 仅业务主键:删除技术主键,保留业务主键。
  5. 添加约束/索引:为业务主键添加唯一约束,为频繁查找属性添加索引。
  6. 关系的外键-用关系替换其他表的外键,然后删除它们。
  7. 无默认值:删除具有默认值的数据,无需存储这些数据。
  8. 清理数据:非规范化表中的重复数据可能必须被拉出到单独的节点中,以获得更干净的模型。
  9. 索引列到数组:索引列名(如email1、email2、email3)可能表示数组属性。
  10. 将表连接到关系:将连接表转换为关系,这些表上的列成为关系属性

在这里插入图片描述

七、图模型建模技巧

要找到适合您需求的最佳数据模型,通常可以使用一些技术并根据分析做出数据模型决策。

首先编写查询

了解要对数据提出的问题和查询类型是确定数据模型结构的好方法。如果您知道查询需要返回某个日期范围内的结果,那么您可能应该确保date不是节点上的属性,而是作为单独的节点或关系存储。

查询按优先级排序

您应该确定哪种模型最适合您的需求。您可能无法在每个查询上最大化性能,但是您可能能够在使用某些资源、时间和代码的情况下最大限度地利用系统。要做到这一点,您需要决定哪些查询必须绝对具有最大性能,哪些功能对于提供价值至关重要。这可能是一个艰难的决定,但无论您使用的是哪种技术,这些决定都会在某些方面存在。使Neo4j更有价值的是,该模型是灵活的,如果您的优先级随着时间的推移而调整,它可以改变。

测试,找到答案的最好方法是用真实数据进行测试

重构模型

根据不断变化的需求随时调整您的图模型。

  1. 导入 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"))
  1. 修改属性类型
MATCH (:Airport)-[connectedTo:CONNECTED_TO]->(:Airport)
CALL apoc.refactor.normalizeAsBoolean(connectedTo, "diverted", ["1"], ["0"])
RETURN count(*)
  1. 从关系改为节点

在这里插入图片描述

该查询使用了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})
  1. 从属性创建节点

目前,航空公司名称存储在 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/

欢迎联系

如果这篇文章对您有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢您的细心阅读,如果发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理 ^_^

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

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

相关文章

React错误:无法在‘node’上执行‘insertBefore‘:要在其前插入新节点的节点不是此节点的子节点

我在NextJS中用cloudinary实现了一个上传图片的页面&#xff0c;结果图片上传之后页面就无法点击操作&#xff0c;并在控制台报错&#xff1a; Failed to execute insertBefore on Node: The node before which the new node is to be inserted is not a child of this node. …

在 Arch Linux 上安装 Linux、Apache、MySQL、PHP(LAMP)堆栈的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 关于 LAMP LAMP 栈是一组用于启动和运行 Web 服务器的开源软件。该首字母缩略词代表 Linux、Apache、MySQL 和 PHP。Arch Linux 使用强…

【HTML】为网页添加列表和超链接

1、列表 1.1、无序列表 <ul><li>列表项1</li><li>列表项2</li><li>列表项3</li> ...... </ul>无序列表的常用type属性值 1.2、有序列表 <ol><li>列表项1</li><li>列表项2</li><li>列…

【乐吾乐大屏可视化组态编辑器】下载离线部署包

下载离线部署包/组件包 在线使用&#xff1a;https://v.le5le.com/ 导出为Zip文件 Zip包主要用于大屏可视化平台快捷导入导出项目。 如图下图所示&#xff0c;Zip包仅包含数据文件和图片文件&#xff0c;不包含js等依赖库。需要有一定开发能力者参考官方文档补充依赖库才能…

AndroidStudio最新版各个repositories下载失败

如下图&#xff0c;各个仓库都是下载失败&#xff0c;网络是有oversea的访问的&#xff0c;不行&#xff0c;我给AndroidStudio网络代理到oversea也不能下载&#xff0c;就很奇怪&#xff0c;就像是AndroidStudio强行把网络访问给墙了 原来Settings.Gradle的配置如下&#xff0…

[Algorithm][贪心][跳跃游戏][加油站][单调递增的数字][坏了的计算器]详细讲解

目录 1.跳跃游戏1.题目链接2.算法思路详解3.代码实现 2.加油站1.题目链接2.算法原理详解3.代码实现 3.单调递增的数字1.题目链接2.算法原理详解3.代码实现 4.坏了的计算器1.代码实现2.算法原理详解3.代码实现 1.跳跃游戏 1.题目链接 跳跃游戏 2.算法思路详解 贪心&#xff1…

【Python机器学习】NLP概述——词序和语法

词的顺序很重要&#xff0c;那些在词序列&#xff08;如句子&#xff09;中控制词序的规则被称为语言的语法&#xff08;也被称为文法&#xff09;。这是之前的词袋或词向量例子中所丢弃的信息。在大多数简短的短语甚至许多完整的句子中&#xff0c;上述词向量近似方法都可以奏…

数据结构——顺序栈和链式栈

目录 引言 栈的定义 栈的分类 栈的功能 栈的声明 1.顺序栈 2.链式栈 栈的功能实现 1.栈的初始化 (1)顺序栈 (2)链式栈 (3)复杂度分析 2.判断栈是否为空 (1)顺序栈 (2)链式栈 (3)复杂度分析 3.返回栈顶元素 (1)顺序栈 (2)链式栈 (3)复杂度分析 4.返回栈的大…

[数据集][目标检测]快递包裹检测数据集VOC+YOLO格式5382张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5382 标注数量(xml文件个数)&#xff1a;5382 标注数量(txt文件个数)&#xff1a;5382 标注…

【JavaSec】JavaIO流

0x04 IO流 文章目录 0x04 IO流创建文件读取文件信息文件目录操作删除创建目录 文件流操作读文件写文件write(byte[] b) 方法write(byte[] b, int off, int len) 方法 文件拷贝 向大佬致敬&#xff1a; https://drun1baby.top 创建文件 三种方法 一张图对比着看 其实感觉差别不…

C语言函数详解(上)【库函数】

目录 前言 一、函数的概念 二、库函数 1.标准库和头文件 2.库函数使用方式 3.如何通过以上的网站查看库函数信息 &#xff08;以sqrt为例&#xff09; 3.1 功能 3.2 头文件包含 3.3 库函数文档的⼀般格式 1. 函数原型 ​编辑2. 函数功能介绍 ​编辑3. 参数和返…

vue路由导航简单实现

1.代码 安装路由模块 npm install vue-router 导入路由组件&#xff1a; import { createRouter, createWebHistory } from vue-router 首先创建三个vue组件显示路由内容&#xff1a; index.vue <template><!-- 首页跳转 --><router-link to"/my"&…

Ciallo~(∠・ω・ )⌒☆第二十四篇 python 异常处理

在Python中&#xff0c;异常处理是一种处理代码中发生错误的机制。它允许我们在运行时捕获和处理异常&#xff0c;以避免程序终止并提供错误信息。 一、try-except语句 try块用于包含可能发生异常的代码&#xff0c;而except块用于捕获和处理异常。一旦try块中的代码引发了异常…

8月21日笔记

Frp Frp(Fast e Reverse ) Proxy) 是一款简单&#xff0c;好用&#xff0c;稳定的隧道工具。Frp 使用 Go语言开发&#xff0c;支持跨平台&#xff0c;仅需下载对应平台的二进制文件即可执行&#xff0c;没有额外依赖。它是一款高性能的反向代理应用&#xff0c;可以轻松地进行…

机器人蓝牙通信绕坑

为机器人添加手机和语音控制是很有必要的&#xff0c;其中蓝牙通信有很多的坑。 一个是蓝牙模块版本&#xff0c;流行的2.0&#xff0c;4.0&#xff0c;5.0一旦买错&#xff0c;会十分麻烦&#xff0c;如果不懂编程&#xff0c;无法和板子通信&#xff0c;又连不上电脑和手机&…

用户画像中挖掘类标签的生产过程

背景 在用户画像中&#xff0c;除了用户的性别年龄等基础标签&#xff0c;我们还可以使用机器学习算法挖掘一些标签&#xff0c;比如用户购买意向等标签 技术方案 挖掘类标签的生产一般有以下的流程图&#xff0c;主要包括特征选择&#xff0c;也就是选择用户的哪些行为作为…

GATK AlleleList接口介绍

在 GATK&#xff08;Genome Analysis Toolkit&#xff09;中&#xff0c;AlleleList 接口是一个用来表示等位基因&#xff08;alleles&#xff09;列表的接口。Allele 是遗传学中用于表示某一特定基因座的不同形式的一个基本单位。AlleleList 接口定义了一些操作&#xff0c;使…

跨境电商系统架构分析

跨境电商系统是一个复杂而庞大的系统工程&#xff0c;涵盖了订单管理、支付管理、物流管理、报关管理、产品管理、跨境营销和数据分析等多个功能模块。这些模块相互协作&#xff0c;共同支撑起跨境电商的全球化运营。 订单管理&#xff1a;负责处理用户的订单信息&#xff0c;…

零基础学习Python(六)

1. 元类的应用 使用元类给对象添加一个固有属性author: 对类名进行限定&#xff0c;要求类名必须是大写字母开头&#xff1a; class MetaC(type):def __init__(cls, name, bases, attrs):if not name.istitle():raise TypeError("类名必须是大写字母开头~")return …

想提升网站排名?试试轮换IP

在竞争激烈的互联网环境中&#xff0c;提高网站排名是每个中小型网站主的共同目标。其中&#xff0c;轮换IP是一种不容忽视的优化工具。虽然听起来可能有些陌生&#xff0c;但轮换IP却能在提升网站排名方面发挥关键作用。本文将深入探讨轮换IP如何帮助中小型网站提升搜索引擎排…