Neo4j数据库中导入CSV示例数据

news2024/11/28 2:10:38

本文简要介绍Neo4j数据库以及如何从CSV文件中导入示例数据,方便我们快速学习测试图数据库。首先介绍简单数据模型以及基本图查询概念,然后通过LOAD CSV命令导入数据,生成节点和关系。

环境准备

读者可以快速安装Neo4j Desktop,启动并创建`City Calls’项目 ,启动数据库并打开Neo4j Brower。

领域模型

领域模型非常简单,可以用三句话表达:

  • 有一些城市

  • 有一些人住在城市

  • 人彼此通话

准备数据

图数据库与其他持久化数据库一样,可以存储数据。下面准备CSV文件数据,包括一些示例数据:

from_dt	to_dt	from_city	from_gender	from_name	from_number	to_city	to_gender	to_name	to_number
2019-01-01T00:37	2019-01-01T00:44	Pattaya	Woman	Aleena	114-397-2007	Pattaya	Woman	Antonella	325-453-5419
2019-01-01T00:54	2019-01-01T01:05	Pattaya	Man	Jaziel	956-780-1788	Kanchanaburi	Man	Gabriel	469-505-9894
2019-01-01T01:01	2019-01-01T01:07	Hua Hin	Woman	Nayeli	320-480-8313	Kanchanaburi	Woman	Freya	587-595-9477
2019-01-01T01:27	2019-01-01T01:41	Bangkok	Man	Javier	655-683-6284	Chiang Mai	Man	Dalton	340-374-5681
2019-01-01T01:48	2019-01-01T01:54	Pattaya	Woman	Everleigh	610-164-4540	Bangkok	Woman	Oakley	574-752-8471
2019-01-01T02:18	2019-01-01T02:28	Chiang Mai	Man	Emmet	215-530-3993	Kanchanaburi	Man	Kareem	974-369-1496
2019-01-01T02:32	2019-01-01T02:41	Pattaya	Man	Henry	620-121-3009	Bangkok	Man	Micah	381-284-2790
2019-01-01T02:40	2019-01-01T02:54	Kanchanaburi	Woman	Lina	448-273-3382	Chiang Mai	Man	Beckham	370-171-4490
2019-01-01T03:40	2019-01-01T03:51	Pattaya	Woman	Alani	183-225-1764	Chiang Mai	Woman	Zaniyah	443-995-7423
2019-01-01T06:04	2019-01-01T06:06	Chiang Mai	Woman	Cassidy	959-149-3497	Bangkok	Man	Enrique	923-682-3283
2019-01-01T06:11	2019-01-01T06:18	Hua Hin	Man	Tadeo	572-552-2898	Chiang Mai	Woman	Gia	531-143-1961
2019-01-01T06:17	2019-01-01T06:21	Hua Hin	Man	Jayceon	108-826-6422	Pattaya	Woman	Jaelyn	283-837-9288
2019-01-01T06:42	2019-01-01T06:47	Hua Hin	Woman	Emerald	315-757-4272	Chiang Mai	Woman	Alivia	295-527-4914
2019-01-01T07:05	2019-01-01T07:09	Kanchanaburi	Man	Alistair	341-910-6735	Hua Hin	Man	Kaleb	366-100-9549
2019-01-01T07:34	2019-01-01T07:42	Bangkok	Man	Clark	655-643-2815	Chiang Mai	Man	Major	805-931-1585
2019-01-01T08:49	2019-01-01T08:56	Pattaya	Man	Dominick	291-616-9899	Pattaya	Woman	Kenna	871-427-1228
2019-01-01T09:18	2019-01-01T09:23	Bangkok	Woman	Aileen	413-665-7064	Pattaya	Woman	Brooklyn	508-151-5830
2019-01-01T09:39	2019-01-01T09:49	Hua Hin	Man	Manuel	523-347-6054	Bangkok	Man	Tobias	252-753-3307
2019-01-01T09:57	2019-01-01T10:06	Hua Hin	Woman	Avalyn	656-507-8932	Hua Hin	Man	Harlan	865-375-6184

我们看到CSV文件每行代表一次通话信息:开始时间、结束时间、人名称、性别、电话号码和城市。为了导入CSV文件至图数据库,首先应该设计图数据结构。

数据模型

CSV一行信息表示谁给谁打了电话,转换该信息至图表示,需要使用两个主要概念:节点和关系。

节点

一个节点代表张三,一个节点代表李四,两者都包括属性:姓名、性别、电话号码和城市。两个节点属于相同类型,都表示一个人,我们称节点类型为节点标签(Node Label)。我们想从行中提取的另一个节点是Call的节点,Duration属性表示呼叫开始和结束之间的分钟差。

关系

目前我们有了几个节点,但这仍然不是一个图。我们的节点之间没有关系,我们需要修复它。从张三给李四打过电话的事实来看,我们可以说张三是打出去的,我们称这种关系为外向[OUT];在另一边,李四接到了一个电话,所以对他来说,这个电话是来电[IN]。

规范化

现在在Person节点中有city属性。这种结构会导致数据重复和潜在的不一致问题。更好的设计是将每个城市作为一个独立的节点,与居住在那里的每个人建立关系。

导入数据

CSV文件可以为远程或本地。本地位置为:\ne4j-desk\data\relate-data\dbmss\dbms-***\import, CSV文件包括头则使用 WITH HEADERS,其他配置参考官方文档:LOAD CSV - Cypher Manual (neo4j.com)

导入脚本如下,下面进行解释说明:

LOAD CSV WITH HEADERS FROM 'file:///e:/city_calls.csv' AS line 
MERGE (c1:City { name: line.from_city })
MERGE (p1:Person{ name: line.from_name,number: line.from_number, gender: line.from_gender })
MERGE (p1)-[:FROM]->(c1)
MERGE (C2:City { name: line.to_city })
MERGE (p2:Person { name: line.to_name,number: line.to_number, gender: line.to_gender })
MERGE (p2)-[:FROM]->(c2)
CREATE (c:Call { from: datetime(line.from_dt), to: datetime(line.to_dt), duration: duration.between(datetime(line.from_dt),datetime(line.to_dt)).minutes })
CREATE (p1)-[:OUT]->(c)<-[:IN]-(p2);

从每一行CSV文件中,我们将得到1个Call节点,潜在的2个Persons节点和可能抽取2个Cities节点。为什么“可能”?因为我们不应该复制同一实体的City和Person节点,而应该只创建一次,然后重用添加更多关系的节点。图中应该仅有一个曼谷城市,所以这个“单实例”要求应该对所有城市、人员和Call节点都成立。

MERGE命令帮助我们避免节点重复。如果指定的结构(节点或节点和关系的组合)在数据库中不存在,那么将创建它,否则跳过。

到目前为止,每一行代表一个事实调用,我们需要所有的事实,我们可以简单地创建调用,没有任何重复的问题。但两次运行此脚本将导致一次又一次地创建相同的Call节点,因此不要重复导入。

查询所有节点进行确认。

MATCH(c) return c;

在这里插入图片描述

参考文档:https://vladbatushkov.medium.com/learn-neo4j-cypher-basics-in-30-minutes-94d68a52544

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

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

相关文章

Mysql中(@i:=@i+1)的介绍

i:i1 表达式 生成伪列实现自增序列 语法&#xff1a; select (i:i1) as ,t.* from table_name t,(select i:0) as j (i:i1)代表定义一个变量&#xff0c;每次叠加 1&#xff1b; (select i:0) as j 代表建立一个临时表&#xff0c;j是随便取的表名&#xff0c;但别名一定…

python和c++哪个更值得学,python和c++学哪个简单

大家好&#xff0c;本文将围绕python和c哪个更值得学展开说明&#xff0c;python和c学哪个简单是一个很多人都想弄明白的事情&#xff0c;想搞清楚c和python哪个好学需要先了解以下几个事情。 1、想学编程&#xff0c;选择Python 还是Java或者C&#xff1f; 首先&#xff0c;我…

MySQL索引失效原因及解决方案

MySQL索引失效原因及解决方案 在使用MySQL数据库时&#xff0c;索引是一种重要的性能优化工具。然而&#xff0c;有时候我们可能会遇到索引失效的情况。本文将介绍几种常见的MySQL索引失效原因以及相应的解决方案&#xff0c;并提供SQL语句的错误示例和正确示例。 1. 字符串字…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 二)

Prop装饰器&#xff1a;父子单向同步 Prop装饰的变量可以和父组件建立单向的同步关系。Prop装饰的变量是可变的&#xff0c;但是变化不会同步回其父组件。 概述 Prop装饰的变量和父组件建立单向的同步关系&#xff1a; Prop变量允许在本地修改&#xff0c;但修改后的变化不会…

tinkerCAD案例:11.制作齿轮

tinkerCAD案例&#xff1a;11.制作齿轮 制作齿轮 Add a cylinder to be the main part of the gear. 添加一个圆柱体作为齿轮的主要部分。 说明 Click and drag a cylinder onto the Workplane. 单击圆柱体并将其拖动到工作平面上。 Change the cylinder dimensions to 35mm …

四、约束-1.概述

一、概念 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 二、目的 保证数据库中数据的正确、有效性和完整性。 三、分类

视觉套件专项活动!与飞桨技术专家一起提升技术实力,更多荣誉奖励等你领取

作为中国最早开源的深度学习框架&#xff0c;飞桨深度践行开源理念&#xff0c;开放拥抱社区&#xff0c;重视生态构建&#xff0c;与开发者和生态伙伴共成长&#xff0c;已成为国内综合竞争力第一的产业级深度学习平台。截至目前&#xff0c;飞桨已凝聚750万名开发者。 在飞桨…

i.MX6ULL(十九) linux gpio子系统

一 简介 pinctrl 子系统重点是设置 PIN( 有的 SOC 叫做 PAD) 的复用 和电气属性&#xff0c; 如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话&#xff0c;那么接下来就要用到 gpio 子系 统了。gpio 子系统顾名思义&#xff0c;就是用于初始化 GPIO 并且提供相…

idea,选中同一个变量高亮显示

阅读复杂代码时&#xff0c;我们经常因为找不清变量位置&#xff0c;而浪费精力重新去看变量名。 效果展示&#xff1a; 在设置里直接搜索按照步骤&#xff0c;勾选然后修改选中变量时的变量背景颜色和字体颜色 这里是设置选中变量时&#xff0c;其他变量的背景颜色和字体颜色…

终于搞懂!数字化、信息化、智能化,到底有什么不同?

引言 随着科技的飞速发展&#xff0c;数字化、信息化和智能化这三个术语在各行各业中频繁出现。然而&#xff0c;许多人对它们之间的区别并不十分清楚。本文旨在阐明数字化、信息化和智能化的含义&#xff0c;探讨它们在实践中的应用&#xff0c;并梳理其异同之处。 一、数字化…

你不知道的AI绘画变现方式

&#x1f3c6; 文章目标&#xff1a;学习AI绘画变现方式 &#x1f340; 入门篇&#xff1a;你不知道的AI绘画变现方式 ✅ 创作者&#xff1a;熊猫Jay ✨ 个人公众号: 熊猫Jay字节之旅 (文末有链接) &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c;请帮忙点个…

【科研必备】生态系统碳循环模型CENTURY建模方法

CENTURY模型&#xff0c;主要基于过程的陆地生态系统生物地球化学循环模型。主要用于模拟不同土壤-植被系统间C、N、P和S的长期动态。根据土壤有机质的分解速率&#xff0c;CENTURY模型将土壤总有机碳&#xff08;TOC&#xff09;分成了三个碳库&#xff0c;即活性、慢性和惰性…

Rest API 开发分享

概述 REST 从资源的角度来观察整个网络&#xff0c;分布在各处的资源由URI确定&#xff0c;而客户端的应用通过URI来获取资源的表示方式。获得这些表徵致使这些应用程序转变了其状态。随着不断获取资源的表示方式&#xff0c;客户端应用不断地在转变着其状态&#xff0c;所谓表…

js获取本js文件名称

使用 script 标签的 src 属性&#xff1a; 如果您的 JavaScript 文件是通过 script 标签引入的&#xff0c;您可以使用以下方法来获取当前脚本的文件名&#xff1a; var scripts document.getElementsByTagName(script); var currentScript scripts[scripts.length - 1]; va…

CMU 15-445 -- Multi-Version Concurrency Control - 16

CMU 15-445 -- Multi-Version Concurrency Control - 16 引言MVCCExample #1Example #2小结 Design DecisionsConcurrency Control ProtocolVersion StorageAppend-Only StorageTime-Travel StorageDelta Storage Garbage CollectionTuple-Level GCTransaction-Level GC Index …

Android编译报错-keystore2

vendor/mediatek/proprietary/trustzone/trustkernel/source/build/k39tv1_64_bsp_k419/array.c vendor/mediatek/proprietary/trustzone/trustkernel/source/build/k39tv1_64_bsp_k419/cert.dat 这个两个文件和厂家名称等配置信息有关。

STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

时钟配置HSI主频配置64M 勾选打开8个通道的ADC 使能连续转换模式 配置好串口&#xff0c;选择异步模式配置好需要的开发环境并获取代码 修改main.c 串口重定向 #include "stdio.h" int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch…

SOP8,SOP10,SOP16封装的PY32F002A/PY32F003管脚复用

PY32F0系列的封装 在PY32F0系列的封装可以分为两大类, 20PIN及以上的和小于20PIN的. 20PIN, 24PIN 和 32PIN, 带有独立的 NRST 和 BOOT0, PIN脚互相独立不复用;8PIN, 10PIN 和 16PIN, 没有 BOOT0, 存在多个PIN脚共用同一个物理管脚的情况 这篇主要介绍没有BOOT0的情况如何修…

Linux:chown、chmod修改文件目录权限命令

chown 命令 可以认为是 "change owner" 的缩写&#xff0c;主要用于修改文件&#xff08;或目录&#xff09;的所有者&#xff0c;除此之外&#xff0c;这个命令也可以修改文件&#xff08;或目录&#xff09;的所属组。 当只需要修改所有者时&#xff0c;可使用如下…

Python 基础(十九):内置函数大全

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、数学相关函数二、序列相关函数三、类型转换函数四、文件操作函数五、输入输出函数…