Neo4j 图数据库 高级操作

Neo4j 图数据库 高级操作

文章目录

  • Neo4j 图数据库 高级操作
    • 1 批量添加节点、关系
      • 1.1 直接使用 `UNWIND` 批量创建关系
      • 1.2 使用 CSV 文件批量创建关系
      • 1.3 选择方法
    • 2 索引
      • 2.1 创建单一属性索引
      • 2.2 创建组合属性索引
      • 2.3 创建全文索引
      • 2.4 列出所有索引
      • 2.5 删除索引
      • 2.6 注意事项
    • 3 清空所有数据
      • 3.1 删除所有节点和关系
      • 3.2 使用 APOC 扩展
      • 3.3 重置数据库(针对 Neo4j 4.0 及以上版本)
      • 3.4 删除数据库文件(仅适用于本地开发环境)
      • 3.5 注意事项

1 批量添加节点、关系

1.1 直接使用 UNWIND 批量创建关系

假设你已经有了 100,000 个节点数据和它们之间的关系数据,可以使用 UNWIND 语句来批量创建节点和关系。

  1. 批量创建节点

    首先,使用 UNWIND 创建节点。

    WITH [{eGuid: 'guid1', eId: 'id1', layer: 'layer1'},{eGuid: 'guid2', eId: 'id2', layer: 'layer2'},...{eGuid: 'guid100000', eId: 'id100000', layer: 'layer100000'}
    ] AS data
    UNWIND data AS row
    CREATE (n:Node {eGuid: row.eGuid, eId: row.eId, layer: row.layer})
    RETURN count(n)
    
  2. 批量创建关系

    假设关系数据如下:

    startGuid,endGuid,relationshipType
    guid1,guid2,RELATED_TO
    guid3,guid4,CONNECTED_TO
    ...
    guid99999,guid100000,ASSOCIATED_WITH
    

    将关系数据存储在一个列表中,并使用 UNWIND 创建关系:

    WITH [{startGuid: 'guid1', endGuid: 'guid2', relationshipType: 'RELATED_TO'},{startGuid: 'guid3', endGuid: 'guid4', relationshipType: 'CONNECTED_TO'},...{startGuid: 'guid99999', endGuid: 'guid100000', relationshipType: 'ASSOCIATED_WITH'}
    ] AS relationships
    UNWIND relationships AS rel
    MATCH (startNode:Node {eGuid: rel.startGuid}), (endNode:Node {eGuid: rel.endGuid})
    CREATE (startNode)-[r:RELATIONSHIP {type: rel.relationshipType}]->(endNode)
    RETURN count(r)
    
  3. C# 代码实现

    List<Dictionary<string, object>> nodeData = new List<Dictionary<string, object>>{new Dictionary<string, object>{{ "eGuid", guid },{ "eId", id },{ "layer", layer },}
    };
    IResultCursor batchInsertNode = await session.RunAsync(@"UNWIND $nodeData AS rowMERGE (n: PrimitiveNode { eGuid: row.eGuid, eId: row.eId, layer: row.layer})RETURN count(n)",new { nodeData });List<Dictionary<string, object>> relationData = new List<Dictionary<string, object>>{new Dictionary<string, object>{{ "startGuid", s_eGuid },{ "endGuid", t_eGuid },{ "relationName", relation },}
    };
    IResultCursor batchInsertRelation = await session.RunAsync(@"UNWIND $relationData AS relMATCH (startNode:PrimitiveNode {eGuid: rel.startGuid}), (endNode:PrimitiveNode {eGuid: rel.endGuid})MERGE (startNode)-[r:PrimitiveRelation {name: rel.relationName}]->(endNode)",new { relationData });
    

1.2 使用 CSV 文件批量创建关系

如果数据量很大,可以将数据存储在 CSV 文件中,然后使用 LOAD CSV 导入。

  1. 创建 CSV 文件

    创建两个 CSV 文件,一个用于节点数据,另一个用于关系数据。

    nodes.csv:

    eGuid,eId,layer
    guid1,id1,layer1
    guid2,id2,layer2
    ...
    guid100000,id100000,layer100000
    

    relationships.csv:

    startGuid,endGuid,relationshipType
    guid1,guid2,RELATED_TO
    guid3,guid4,CONNECTED_TO
    ...
    guid99999,guid100000,ASSOCIATED_WITH
    
  2. 加载 CSV 文件并创建节点

    LOAD CSV WITH HEADERS FROM 'file:///nodes.csv' AS row
    CREATE (:Node {eGuid: row.eGuid, eId: row.eId, layer: row.layer})
    RETURN count(*)
    
  3. 加载 CSV 文件并创建关系

    LOAD CSV WITH HEADERS FROM 'file:///relationships.csv' AS row
    MATCH (startNode:Node {eGuid: row.startGuid}), (endNode:Node {eGuid: row.endGuid})
    CREATE (startNode)-[r:RELATIONSHIP {type: row.relationshipType}]->(endNode)
    RETURN count(r)
    

1.3 选择方法

  • 如果数据结构简单,且数据量不大,可以直接在 Cypher 查询中使用 UNWIND
  • 对于大量数据,CSV 文件导入方法非常高效。
  • 使用编程语言的批量插入方法适合需要复杂逻辑处理的数据。

2 索引

2.1 创建单一属性索引

要在单个属性上创建索引,可以使用以下命令:

CREATE INDEX index_name FOR (n:Label) ON (n.property)

例如:

CREATE INDEX person_name_index FOR (p:Person) ON (p.name)

2.2 创建组合属性索引

要在多个属性上创建组合索引,可以使用以下命令:

CREATE INDEX index_name FOR (n:Label) ON (n.property1, n.property2)

例如:

CREATE INDEX person_name_dob_index FOR (p:Person) ON (p.name, p.dob)

2.3 创建全文索引

Neo4j 还支持全文索引,可以用于全文搜索。要创建全文索引,可以使用以下命令:

CALL db.index.fulltext.createNodeIndex('index_name', ['Label'], ['property'])

例如:

CALL db.index.fulltext.createNodeIndex('person_name_index', ['Person'], ['name'])

2.4 列出所有索引

要查看数据库中现有的所有索引,可以使用以下命令:

CALL db.indexes

2.5 删除索引

要删除一个索引,可以使用以下命令:

DROP INDEX index_name

例如:

DROP INDEX person_name_index

2.6 注意事项

  1. 索引创建时间:索引的创建可能需要一些时间,特别是在包含大量数据的情况下。建议在数据库维护时创建索引。
  2. 索引类型:Neo4j 支持多种类型的索引,包括 B-tree 索引、全文索引等。选择适合查询需求的索引类型。
  3. 版本差异:不同版本的 Neo4j 在索引语法和功能上可能有所不同,建议查阅对应版本的官方文档以获取准确的信息。

3 清空所有数据

3.1 删除所有节点和关系

  1. 删除所有关系

    MATCH ()-[r]-()
    DELETE r
    
  2. 删除所有节点

    MATCH (n)
    DELETE n
    

    该命令尝试直接删除匹配到的节点 n。如果节点 n 还有任何连接的关系,这条命令会失败并报错,因为 Neo4j 不允许直接删除仍然连接着关系的节点。

    使用限制:只能删除没有任何关系的孤立节点。

  3. 删除所有节点

    MATCH (n)
    DETACH DELETE n
    

    该命令不仅删除匹配到的节点 n,还会先删除与该节点连接的所有关系。这样就避免了直接删除节点时可能遇到的错误。

    使用优势:能够删除任何节点,无论它们是否连接着关系。

3.2 使用 APOC 扩展

如果安装了 APOC 扩展,可以使用更简便的方法:

CALL apoc.periodic.iterate('MATCH (n) RETURN n','DETACH DELETE n',{batchSize: 1000}
)

3.3 重置数据库(针对 Neo4j 4.0 及以上版本)

如果你使用的是 Neo4j 4.0 及以上版本,可以使用 dbms.clearDatabase() 命令重置数据库:

CALL dbms.clearDatabase()

3.4 删除数据库文件(仅适用于本地开发环境)

如果你在本地开发环境中,可以通过删除数据库文件来清空所有数据。这需要停止 Neo4j 服务,删除数据库文件,然后重新启动服务。

  1. 停止 Neo4j 服务

    neo4j stop
    
  2. 删除数据库文件

    默认情况下,数据库文件位于 data/databases/ 目录下。例如,对于默认数据库 neo4j,删除相应文件:

    rm -rf data/databases/neo4j
    
  3. 重新启动 Neo4j 服务

    neo4j start
    

3.5 注意事项

  1. 备份数据:在清空数据之前,建议先备份现有数据,以防需要恢复。
  2. 权限:确保执行清空数据操作的用户具有足够的权限。
  3. 环境:在生产环境中执行这些操作时要格外小心,确保不会影响正常运行的数据和服务。

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

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

相关文章

后端之路第三站(Mybatis)——JDBC跟Mybatis、lombok

一、什么是JDBC JDBC就是sun公司研发的一套通过java来操控数据库的工具&#xff0c;对应不同的数据库系统有不同的JDBC&#xff0c;而他们统称【驱动】&#xff0c;这就是上一篇我们提到创建Mybatis项目时要引入的依赖、以及连接数据库四要素里的第一要素。 JDBC有自己一套原始…

SerialportToTCP② 全

效果补全&#xff08;代码&#xff09;&#xff1a; namespace SerialportToTCP {public partial class Form1 : Form{IniHelper Ini;string[] botelvs new string[] { "1200", "4800", "9600", "13200" };public Form1(){Initializ…

Elasticsearch:Painless scripting 语言(一)

Painless 是一种高性能、安全的脚本语言&#xff0c;专为 Elasticsearch 设计。你可以使用 Painless 在 Elasticsearch 支持脚本的任何地方安全地编写内联和存储脚本。 Painless 提供众多功能&#xff0c;这些功能围绕以下核心原则&#xff1a; 安全性&#xff1a;确保集群的…

安卓gdb 建立链接

adbshell gdbserver :1234 testdcam --sensor 0 --workmode 0 --args preview-size1024x600,picture-size640x480, --time 10 adb forwardtcp:1234 tcp:1234 //设置adb的转发 ./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gdb out/tar…

近红外光谱脑功能成像(fNIRS):1.光学原理、变量选取与预处理

一、朗伯-比尔定律与修正的朗伯-比尔定律 朗伯-比尔定律 是一个描述光通过溶液时被吸收的规律。想象你有一杯有色液体&#xff0c;比如一杯红茶。当你用一束光照射这杯液体时&#xff0c;光的一部分会被液体吸收&#xff0c;导致透过液体的光变弱。朗伯-比尔定律告诉我们&#…

mmdetection3D指定版本安装指南

1. 下载指定版本号 选择指定版本号下载mmdetection3d的源码&#xff0c;如这里选择的是0.17.2版本 git clone https://github.com/open-mmlab/mmdetection3d.git -b v0.17.22. 安装 cd mmdetection3d安装依赖库 pip install -r requirment.txt编译安装 pip install -v e .…

redis主从复制哨兵模式集群管理

主从复制&#xff1a; 主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&#xff1a;故障恢复无法自动化&#xff1b;写操作无法负载均衡&…

软件测试与质量保证 | 云班课简答题库

目录 第14章 质量相关简答题 第15章 测试实际相关简答题 第16章 测试基本相关简答题 第14章 质量相关简答题 1. 简述基本的测量原则。 测量应该基于该应用领域正确的理论之上&#xff0c;并在测量的定义中确定测度的目标&#xff1b;每一个技术测量的定义应该具有一致性和客…

HbuilderX:安卓打包证书.keystore生成与使用

前置条件 已安装jdk或配置好jre环境。 .keystore生成 打开cmd,切换到目标路径,输入以下命令, keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore 输入密钥库口令(要记住), 然后输入一系列信息, …

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列 1.打开https://ui.perfetto.dev 导入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.点击Query(SQL),在输入框中输入以下内容,按CtrlEnter,显示查询结果4.点击Show timeline,点击…

2024年07年01日 Redis数据类型以及使用场景

String Hash List Set Sorted Set String&#xff0c;用的最多&#xff0c;对象序列化成json然后存储 1.对象缓存&#xff0c;单值缓存 2.分布式锁 Hash&#xff0c;不怎么用到 1.可缓存经常需要修改值的对象&#xff0c;可单独对对象某个属性进行修改 HMSET user {userI…

Windows快速打开某个路径下的PowerShell

按住Shift右键打开&#xff1a; 在桌面或者文件夹页面中&#xff0c;按住右键&#xff0c;在弹出的右键菜单中选择“在终端中打开”或“在此处打开Powershell窗口“&#xff0c;就可打开windows PowerShell界面&#xff0c;且路径为桌面或打开的文件夹所在路径。

浅谈贝叶斯定理

引言 贝叶斯定理用于确定事件的条件概率。它以一位英国统计学家的名字命名&#xff0c;托马斯贝叶斯他在1763年发现了这个公式。贝叶斯定理是数学中一个非常重要的定理&#xff0c;它为一种独特的统计推断方法奠定了基础。贝氏推论它用于根据可能与事件相关的条件的先验知识&a…

C++基础(三):C++入门(二)

上一篇博客我们正式进入C的学习&#xff0c;这一篇博客我们继续学习C入门的基础内容&#xff0c;一定要学好入门阶段的内容&#xff0c;这是后续学习C的基础&#xff0c;方便我们后续更加容易的理解C。 目录 一、内联函数 1.0 产生的原因 1.1 概念 1.2 特性 1.3 面试题 …

用随机森林算法进行的一次故障预测

本案例将带大家使用一份开源的S.M.A.R.T.数据集和机器学习中的随机森林算法&#xff0c;来训练一个硬盘故障预测模型&#xff0c;并测试效果。 实验目标 掌握使用机器学习方法训练模型的基本流程&#xff1b;掌握使用pandas做数据分析的基本方法&#xff1b;掌握使用scikit-l…

三大常用集合

1.Set集合 在Java中&#xff0c;Set是一种集合类型&#xff0c;它是一种不允许包含重复元素的集合&#xff0c;每个元素在Set中是唯一的。Set接口的常用实现类有HashSet、TreeSet和LinkedHashSet。以下是关于Set集合的一些重要特点和用法&#xff1a; 特点&#xff1a; 不允…

什么是mysql的回表操作

MySQL中的“回表”操作是指在执行查询时&#xff0c;由于索引结构的限制&#xff0c;数据库系统需要从非聚集索引&#xff08;Secondary Index&#xff09;中找到主键值&#xff0c;然后使用这些主键值回溯到聚集索引&#xff08;Clustered Index&#xff09;中获取完整的行数据…

珠江电缆,承载您梦想的每一度电

在现代社会&#xff0c;电力无处不在&#xff0c;它不仅是经济发展的动力&#xff0c;更是每个人生活中不可或缺的能量来源。而在这个电力驱动的世界里&#xff0c;有一家企业默默地承载着千家万户的梦想&#xff0c;它就是珠江电缆。 连接梦想的每一度电 珠江电缆成立于2001…

使用Java实现单元测试:JUnit教程

使用Java实现单元测试&#xff1a;JUnit教程 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在软件开发中&#xff0c;单元测试是保证代码质量和功能正确性的重要手段之一。JUnit是Java语言中最流行…

绝区零国际服下载 一键下载绝区零国际服教程

绝区零是一款米哈游倾情打造的全新都市幻想动作角色扮演游戏。在游戏中&#xff0c;我们将扮演一名绳匠&#xff0c;这是为出于各种原因需要进入危险空洞的人提供指引的专业人士。您将与独特的角色一起踏上冒险之旅&#xff0c;携手探索空洞&#xff0c;对战强大敌人&#xff0…