首页 > 数据库 >Neo4j图数据库操作

Neo4j图数据库操作

时间:2024-07-03 17:58:23浏览次数:18  
标签:删除 创建 数据库 eGuid 索引 操作 Neo4j 节点 row

Neo4j图数据库操作

文章目录

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 row
          MERGE (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 rel
          MATCH (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. 环境:在生产环境中执行这些操作时要格外小心,确保不会影响正常运行的数据和服务。

标签:删除,创建,数据库,eGuid,索引,操作,Neo4j,节点,row
From: https://blog.csdn.net/szy13323042191/article/details/140159021

相关文章

  • 实现多个菜单或者多个操作按钮一键收起展开
    项目中有多个菜单按钮,显示为一排时很占位置不好看,所以就考虑做成可以收缩起来,使用时在展开,并且加上收起展开的动画效果,使其看起来更加自然好看,效果展示图片如下(结尾有视频效果展示):展开时:收起时:下面将我实现的代码展示:html代码片段:<divclass="bottom-operate-container"......
  • Oracle数据库统计信息收集
    Oracle数据库统计信息收集重新收集表统计信息--重新收集表统计信息BEGINDBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'ORCL',TABNAME=>'XXX',ESTIMATE_PERCENT=>100,DEGREE=>4);END;重新收集列统计信息......
  • 小白也能懂的Mysql数据库索引详解
    核心概念主键索引/二级索引聚簇索引/非聚簇索引回表/索引覆盖索引下推联合索引/最左联合匹配前缀索引explain一、[索引定义]1.索引定义在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现......
  • go基本操作
    1.gowsl环境搭建注意事项:ubuntu必须安装在系统盘(C盘)VSode插件下载:koroFileHeader自动添加注释:VScode自动添加注释_vscode自动注释-CSDN博客go中文下载地址:Go下载-Go语言中文网-Golang中文社区golang开发环境下载:Allreleases-TheGoProgrammingLanguagego中文......
  • python操作哨兵、集群、缓存优化
    【python操作哨兵】11redis的主从,一主多从22高可用:sentinal:哨兵3多个哨兵:配置文件---》监控我们主从状态--》当发现主库--》故障转移43python如何操作哨兵567--------------------------------------------------------------------------------......
  • Gitblit的基本操作和技巧
    Gitblit是一个开源的、轻量级的Git服务器,使用Java编写,能够提供简单的Web界面来浏览Git仓库、管理用户和仓库权限,以及进行一些基本的Git操作。安装时最重要的是配置gitblit.properties文件以自定义Gitblit的行为,例如更改端口、设置HTTPS。如果不要求严格的认证,最好同时设置http......
  • 操作系统大题复习
    磁盘调度算法一次磁盘读写需要的时间寻道时间先来先服务FCFS优点:公平缺点:性能差,寻道时间长最短寻道时间有限SSTF缺点:可能产生饥饿现象扫描算法SCAN优点:不会产生饥饿现象缺点:响应频率不平均循环扫描算法C-SCAN优点:磁道响应频率平均缺点:平均寻道时间长多道......
  • 05-Excel初阶操作-学习笔记
    DATE函数函数格式:DATE(参数1,参数2,参数3)参数说明:参数1:年份;参数2:月份;参数3:日作用:将文本类型转换为正确的日期格式应用场景:身份证号提取出生日期其中,MID()是文本截取函数注意!如果输入2000-2-30使用date函数后会进行进位显示2000-3-1Year、Month、Day函数作用:日期拆分为......
  • dfsvc.exe 是 Windows 操作系统中的一个系统进程,它的全称是 "ClickOnce Deployment Se
    dfsvc.exe是Windows操作系统中的一个系统进程,它的全称是"ClickOnceDeploymentService"。这个进程主要用于支持ClickOnce技术,它是一种用于在Windows平台上发布和部署应用程序的技术。具体来说,ClickOnce是一种轻量级的、易于部署的应用程序部署技术,通常用于分发和更新.NE......
  • IBM服务器SQL/ Oracle数据库修复
    一、故障诊断:1.使用IBM服务器管理工具(如IBMStorageManager)连接到服务器,检查当前存储状态和数据库状态。2.查看错误日志和系统日志,确定数据库损坏的具体原因,如硬盘故障、RAID阵列崩溃、文件系统损坏等。风险评估:1.评估数据库损坏的严重程度和恢复的可能性。2.确定是否有可用......