一、几大导入方式的差异
1. neo4j-admin import:
- 只能初始化,若要用的话必需清空之前的数据库。
- 不能很好的适应不断要添加新节点和关系的需求。
- 必需关闭数据库 neo4j stop
2. LOAD CSV
- 可以在原数据库基础上新增数据,导入中小型数据,1kw条左右
- 不用关闭数据库,可以直接在browser操作
- CSV文件的URL可以由后面的任意表达式来确定
- LOAD CSV也支持通过HTTPS、HTTP和FTP来访问CSV文件
- LOAD CSV支持以gzip,Deflate和ZIP压缩的资源
- 但数度较慢
二、LOAD CSV 文件URL的配置项
1. 在配置文件中,默认是运行使用file:///URL来加载数据的。
2. 若把值改为false,则完全禁止LOAD CSV访问文件系统。
dbms.security.allow_csv_import_from_file_urls=false //完全禁止访问文件系统
3. file:///根路径的设置:默认在import文件夹
# See the `LOAD CSV` section of the manual for details.
dbms.directories.import=import
- 可以限制访问数据库import文件夹以外的文件
示例:若URL为’file:///ceshi.csv‘
LOAD CSV 语句从 <NEO4J_HOME>/import/ceshi.csv 读取数据
绝对路径:D:/neo4j/neo4j-community-4.4.18/import/ceshi/ceshi.csv
相对路径:file:///ceshi/ceshi.csv
- file:/// == <NEO4J_HOME>/import/
4.也可以把默认的访问地址改为别的文件夹,即:dir_name
dbms.directories.import=dir_name
- TIPS:若此行代码生效后,数据库则不能访问该文件夹以外的其他文件。
三、LOAD CSV语句
USING PERIODIC COMMIT n
LOAD CSV WITH HEADERS FROM 'URL' AS line
- with headers: 读取首行 读取文件第一行作为参数名 若没有该参数名,则要用line[0]、line[1]来索引;有该参数则可用line.name来索引
- as line: 重命名 建立索引
- USING PERIODIC COMMIT n:分批导入 每n条提交一次;默认值为1000
- fieldterminator',' :自定义字段定界符 默认csv分隔符为逗号
TIPS: CSV读取文件数据是String类型,可以通过函数转换为其他类型 toInt()...
示例:
LOAD CSV WITH HEADERS FROM 'file:///ceshi/ceshi.csv' AS line
CREATE (:盾构机初始维护 { ID: line.ID, 系统名称: line.系统名称, 部件名称: line.部件名称, 初始维护工作内容: line.初始维护工作内容, 补充说明: line.补充说明, 油品名称: line.油品名称, 备注: line.备注, LABEL: line.LABEL})
问题1:
- 不能判断节点是否已经存在,会重复导入 没有判别能力
- 与neo4j-admin import相比:ID只是属性列 不是索引列 没有唯一性
解决:
- 先设定好文档,一次性导入,避免冲突。---最好的解
- 利用create constraint on俩添加唯一性约束
CREATE CONSTRAINT ON (n:`label_name`) ASSERT n.ID IS UNIQUE
label_name:即用label来筛选节点,再将节点的id设唯一约束
问题2???用merge来判断节点是否存在有很大的问题:若原数据库某些节点的某些属性为空值,则在用merge时会报错:
解决1:---不成功
- 查询到官网的解决办法:Explanation of error "Cannot merge node using null property value for" - Knowledge Base (neo4j.com)
LOAD CSV WITH HEADERS FROM 'file:///ceshi1/7.4.3-4盾构机周维护1.csv' AS line with line where line.补充说明 and line.备注 is not null
merge (:盾构机周维护 { ID: line.ID, 系统名称: line.系统名称, 部件名称: line.部件名称, 周维护工作: line.周维护工作, 补充说明: line.补充说明, 备注: line.备注, LABEL: line.LABEL })
- 依旧存在问题:对于新添加节点中有被忽略属性其值不为空时,会报错
- 下面例子为:新添加的节点其’补充说明‘列不为空,则无法处理。
解决2:
- 将所有空值单元格用'\'填充 结合 merge 则不会出现空值报错
先添加的文件节点文件【7.4.3-4盾构机周维护.csv】:空值填充
二次导入节点文件【7.4.3-4盾构机周维护1.csv】---仅新增最后一个
结果:添加成功
新添加节点信息如下图:
四、流程小结
Step1:命令直接创建节点 用 MERGE
LOAD CSV WITH HEADERS FROM 'file:///file_name.csv' AS line
MERGE (:Label { ID: line.ID, 系统名称: line.系统名称, 部件名称: line.部件名称, 周维护工作: line.周维护工作, 补充说明: line.补充说明, 备注: line.备注, LABEL: line.LABEL })
自动命令生成见python代码: 3.Load_csv.py
Step2:创建唯一约束-ID列 CREATE CONSTRAINT ON
CREATE CONSTRAINT ON (n:`label`) ASSERT n.ID IS UNIQUE
Step3:检验能否判断节点是否存在 继续用step1的代码导入新文件~
补充:
- 删除节点命令:用LABEL检索---换成要删除的节点的label
MATCH (r:`LABEL`) DETACH DELETE r
- 删除约束命令:---与创建约束代码对应
DROP CONSTRAINT ON (n:`LABEL`) ASSERT n.ID IS UNIQUE
Neo4j系列记录:
(1)导入导出dump文件:(21条消息) Neo4j---(1)导入导出dump文件_俩小歪的博客-CSDN博客
(2)批量导入实体和关系csv文件之neo4j-admin import:文章来源:https://www.toymoban.com/news/detail-723694.html
(6条消息) Neo4j---(2)批量导入实体和关系csv文件之neo4j-admin import_俩小歪的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-723694.html
到了这里,关于Neo4j---(3)批量导入实体和关系csv文件之LOAD CSV的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!