目前我的数据来源于一个项目,这个项目需要需要把neo4j的数据用于信息系统中,后续会写d3绘制力导向图,自己绘制neo4j这种图数据。也算是一步步踩坑,这篇博客是neo4j的部分,包含创建neo4j数据库,csv导入数据,查询等,还有一些小知识,会持续更新。
清空数据库
MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r
新建数据库
neo4j默认数据库是graph.db
想要新建数据库要修改neo4j的配置文件 neo4j安装目录下的con文件中的config文件
我的neo4j config文件路径如下 D:\softwares\neo4j-community-3.5.26\conf\neo4j.conf
全局搜索 dbms.active_database= 找到默认数据库名称
直接在 # dbms.active_database=graph.db下添加自己的数据库
保存重启neo4j 可以看到已经是一个全新的数据库了,之前的内容消失了
倘若要返回以前的数据库,在conf文件里注释掉新建数据库,取消注释graph.db就能回到之前的数据库了。一般graph.db是默认数据库,当全部注释的时候,会默认进入graph.db数据库
从csv导入数据
分两种,从本地和远程
从远程比较简单
load csv from 'XXXX地址' as XXX create/merge XXXXX
LOAD CSV FROM 'url地址' as line merge (a:customer{personId:line[0],name:line[1],type:line[2]})
create表示新建,不会有去重效果,merge表示没有就新建,有就去重,就不用新建
要注意不管是远程还是本地,load csv from 'XXXX地址' 是得到一整个东西,想要插入数据,要一条一条把数据读完,所以需要create或者merge来创建合并,并且要把里面的字段作为属性遍历完,很多教程直接load csv from XX,亲测会报错,一定记得加merge或create。
本地读入csv
类似的,但是导入本地文件,文件名前面要加前缀 file:///
并且neo4j有一个默认安全设置,只能从特定文件夹导入数据,在neo4j安装目录的 import目录下
放一个实体的文件夹在import目录下,里面有多个实体csv,导入数据方式如下
//添加疾病实体disease
LOAD CSV with headers FROM 'file:///entities/Disease.csv' as row merge (d:disease{name:row.entity_name})
剩下的写一起
// 添加部位实体
LOAD CSV with headers FROM 'file:///entities/Position.csv' as row merge (d:position{name:row.entity_name})
//添加症状实体
LOAD CSV with headers FROM 'file:///entities/Symptom.csv' as row merge (d:symptom{name:row.entity_name})
//添加检查实体
LOAD CSV with headers FROM 'file:///entities/Test.csv' as row merge (d:test{name:row.entity_name})
//添加治疗实体
LOAD CSV with headers FROM 'file:///entities/Treatment.csv' as row merge (d:treatment{name:row.entity_name})
注意:倘如csv文件有列名,就必须要用with headers,以及后面访问字段要用row.列名,或者row['列名'],不能用row[0],row[1]这种方式访问
创建关系 DAP
// DAP 疾病施加于部位
LOAD CSV WITH HEADERS FROM "file:///relations/DAP.csv" AS line match (from:disease{name:line.entity_head}),(to:position{name:line.entity_tail}) merge (from)-[d:DAP]->(to)
剩下的写一起,但是运行时注意要逐条运行,不然会报错
//SAP 症状施加于部位
LOAD CSV WITH HEADERS FROM "file:///relations/SAP.csv" AS line
match (from:symptom{name:line.entity_head}),(to:position{name:line.entity_tail})
merge (from)-[d:SAP]->(to)
//SNAP 部位不存在症状
LOAD CSV WITH HEADERS FROM "file:///relations/SNAP.csv" AS line
match (from:symptom{name:line.entity_head}),(to:position{name:line.entity_tail})
merge (from)-[d:SNAP]->(to)
//TeAP 检查施加于部位
LOAD CSV WITH HEADERS FROM "file:///relations/TeAP.csv" AS line
match (from:test{name:line.entity_head}),(to:disease{name:line.entity_tail})
merge (from)-[d:TeAP]->(to)
//TeAS 因为症状采取检查
LOAD CSV WITH HEADERS FROM "file:///relations/TeAS.csv" AS line
match (from:test{name:line.entity_head}),(to:symptom{name:line.entity_tail})
merge (from)-[d:TeAS]->(to)
//TeCP 检查结果包含部位
LOAD CSV WITH HEADERS FROM "file:///relations/TeCP.csv" AS line
match (from:test{name:line.entity_head}),(to:position{name:line.entity_tail})
merge (from)-[d:TeCP]->(to)
//TeRD 检查确证了疾病
LOAD CSV WITH HEADERS FROM "file:///relations/TeRD.csv" AS line
match (from:test{name:line.entity_head}),(to:disease{name:line.entity_tail})
merge (from)-[d:TeRD]->(to)
//TeRS 检查结果发现症状
LOAD CSV WITH HEADERS FROM "file:///relations/TeRS.csv" AS line
match (from:test{name:line.entity_head}),(to:symptom{name:line.entity_tail})
merge (from)-[d:TeRS]->(to)
//TrAD 治疗施加于疾病
LOAD CSV WITH HEADERS FROM "file:///relations/TrAD.csv" AS line
match (from:treatment{name:line.entity_head}),(to:disease{name:line.entity_tail})
merge (from)-[d:TrAD]->(to)
//TrAP 治疗施加于部位
LOAD CSV WITH HEADERS FROM "file:///relations/TrAP.csv" AS line
match (from:treatment{name:line.entity_head}),(to:position{name:line.entity_tail})
merge (from)-[d:TrAP]->(to)
//TrRD 治疗确诊了疾病
LOAD CSV WITH HEADERS FROM "file:///relations/TrRD.csv" AS line
match (from:treatment{name:line.entity_head}),(to:disease{name:line.entity_tail})
merge (from)-[d:TrRD]->(to)
查询
//找到胃癌有关的部位
match (p:position)-[relatedTo]-(:disease{name:"胃癌"}) return p.name
//查询和胃癌相关的所有结点和关系
match(n)--(:disease{name:"胃癌"}) return n
修改标签名
由于后期需要需要在java中设置test实体,产生了命名冲突,修改test实体的标签为test_
MATCH (n:test) REMOVE n:test SET n:test_