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

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 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/

欢迎联系

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

相关文章:

Neo4j 图数据库入门

图形数据库存储节点和关系&#xff0c;而不是表或文档。数据的存储方式就像你在白板上勾画想法一样。您的数据存储不受预定义模型的限制&#xff0c;允许以非常灵活的方式考虑和使用它。 一、核心概念&#xff1a;属性图形模型 Neo4j使用属性图数据库模型。图数据结构由节点(离…...

linux 磁盘满了,程序运行失败,如何处理?df -h

场景&#xff1a;紧急呼救&#xff0c;上传图片失败了。我一脸懵&#xff0c;服务器这是又咋地了&#xff0c;别邪乎姐姐&#xff0c;姐姐胆子小啊。 一、寻找问题原因 1、OSS出问题了&#xff1f; 然后我尝试了 IOS 的APP是没问题的&#xff0c;Android提示上传失败&#xf…...

Python编码系列—前端后浪:Python前后端分离开发实战指南

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

Docker学习之路【五】了解数据卷

定义与特性 Docker数据卷是一个特殊目录&#xff0c;&#xff0c;用于实现容器间数据的持久化和共享。数据卷存在于宿主机上&#xff0c;可以被一个或多个容器使用。它独立于容器的生命周期&#xff0c;意味着即使容器被删除&#xff0c;数据卷中的数据也会保留。数据卷的主要…...

matlab如何设置产生的随机数一致

在MATLAB中&#xff0c;确保产生的随机数序列一致&#xff0c;通常需要使用随机数生成器的种子&#xff08;seed&#xff09;。通过设置相同的种子值&#xff0c;可以确保在每次运行代码时&#xff0c;随机数生成器从相同的初始状态开始&#xff0c;从而生成相同的随机数序列。…...

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配置)

源码链接&#xff1a; https://github.com/USE-jx/NMPC_CASADI_CPP?tabreadme-ov-file #这是NMPC的 里面有Fast-Planner&#xff0c;但编译可能缺少东西&#xff0c;所以再放一个Fast-Planner的&#xff0c;可以装装缺少的库 https://github.com/HKUST-Aerial-Robotics/Fast-P…...

Python核心编程--Python要点总结

Python 核心编程包括了一些关键的要点&#xff0c;理解这些要点对于掌握 Python 至关重要。以下是 Python 核心编程的一些要点&#xff1a; 1. 数据类型与数据结构 基本数据类型: int, float, str, bool容器类型: list, tuple, set, dict不可变类型与可变类型: tuple 是不可变…...

【mysql】mysql配置文件之优先级学习

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

自然语言处理(NLP)大模型

自然语言处理&#xff08;NLP&#xff09;大模型 自然语言处理&#xff08;NLP&#xff09;领域中的一种重要技术&#xff0c;具有强大的语言理解和生成能力。以下是对NLP大模型的详细介绍&#xff1a; 一、定义与背景 NLP大模型是指通过大规模预训练和自监督学习技术构建的…...

融合创新趋势:Web3时代的跨界融合

随着互联网技术的飞速发展&#xff0c;Web3时代的到来正引领着一场深刻的技术与社会变革。Web3&#xff0c;作为下一代互联网技术的代表&#xff0c;不仅仅是一种技术创新&#xff0c;更是一种跨界融合的趋势。通过去中心化、智能合约和区块链技术的应用&#xff0c;Web3正在重…...

面临新时代的机遇与挑战,联想凌拓将如何破局?

近年来&#xff0c;IT行业的技术进步日新月异&#xff0c;云计算、大数据、人工智能……各种新兴技术犹如雨后春笋般层出不穷&#xff0c;并且正在给千行百业带来全面的变革甚至重塑。 然而以上提到的所有新兴技术&#xff0c;都离不开数据的存储与管理。那么作为中国乃至全球领…...

2024.8.21

作业&#xff1a; 运行1个服务器和2个客户端 实现效果&#xff1a; 服务器和2个客户端互相聊天&#xff0c;服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接&#xff0c;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…...

后端开发刷题 | 合并两个排序的链表

描述 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围&#xff1a; 0≤n≤1000&#xff0c;−1000≤节点值≤1000 如输入{1,3,5},{2,4,6}时&#xff0c;合并后的链表为{1,2,3,4,5,6}&#xff0c;…...

JAVA_7

JAVA_7 JAVA面向对象编程1. 抽象方法和抽象类 JAVA面向对象编程 1. 抽象方法和抽象类 使用abstract修饰的方法&#xff0c;没有方法体&#xff0c;只有声明。定义的是一种“规范”&#xff0c;就是告诉子类必须要给抽象方法提供具体的实现。包含抽象方法的类就是抽象类。通过…...

最大连续1的个数 III(LeetCode)

题目 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 解题 def longestOnes(nums, k):left 0max_len 0zero_count 0for right in range(len(nums)):# 如果遇到0&#xff0c;统计当前窗口内0的个…...

Vue之前端批量下载文件并以压缩包形式存储

后端返回一个文件链接的数组&#xff0c;前端处理下载逻辑&#xff0c;并且将这些文件存储在压缩包内部&#xff0c;这用的jszip 和 file-saver 这两个库。 步骤说明 1.使用 npm 或 yarn 安装 jszip 和 file-saver。 npm install jszip file-saver 2.获取文件内容&#xff1a…...

【AI学习】LLaMA模型的微调成本有几何?

在前面文章《LLaMA 系列模型的进化&#xff08;二&#xff09;》中提到了Stanford Alpaca模型。 Stanford Alpaca 基于LLaMA (7B) 进行微调&#xff0c;通过使用 Self-Instruct 方法借助大语言模型进行自动化的指令生成&#xff0c;Stanford Alpaca 生成了 52K 条指令遵循样例数…...

【专题】2024全数驱动 致胜未来-数字化敏捷银行白皮书报告合集PDF分享(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p37404 政策明确发展使命&#xff0c;新时代商业银行应坚持党建引领&#xff0c;秉持高质量发展理念。数字经济已成大势&#xff0c;商业银行需构建数字基础设施能力&#xff0c;强化顶层战略规划。当前商业银行数字化发展面临诸多挑…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...