neo4j的Cypher可以使用LOAD CSV导入数据,但是文件过大会导致OOM,可以提前分割数据,也可以用程序分割好,让Cypher读
#导入节点 []为要替换的文本
LOAD CSV WITH HEADERS FROM '[http地址或文件名,放入服务器的import中]' AS line FIELDTERMINATOR '[csv分割线]'
CREATE (n:[节点类名] {[节点属性名]: line.[列名],[节点属性名]: line.[列名]})
#创建索引
CREATE INDEX IF NOT EXISTS FOR (n:[节点名]) on (n.[节点属性])
#导入关系
#建立关系前要创建索引,否则建立关系极慢
LOAD CSV WITH HEADERS FROM '[http地址或文件名,放入服务器的import中]' AS line FIELDTERMINATOR '[csv分割线]'
MATCH (from:[节点类名]{[节点属性名]: line.[列名]}),(to:[节点类名]{[节点属性名]: line.[列名]})
MERGE (from)-[r:[关系类名]]->(to)
用python分割
def load_data(graph,file_name,query):
# 这里用|做分隔符,因为文档里可能有逗号
data = pd.read_csv(file_name, sep='|', index_col=0)
for i in range(len(data) //10000 + 1):
tic = time.time()
temp = data[i * conf.batch:i * 10000 + 9999] #每10000行一个文件,还OOM就再减少
temp.to_csv(conf.dir_temp + 'temp.csv', sep='|')
graph.run(query) #query内是LODA CSV指令,graph是连接的数据库
toc = time.time()
print(name, i, shijian)
如果数据已经成型,用neo4j-admin导入更方便,这里的方法可以对数据进行一些处理,性能并不是最优
删除文件如果oom,用limit可以避免
#删除节点:
MATCH (n)
WITH n
LIMIT 1000000
DELETE n
RETURN count(*);
#删除关系:
MATCH ()-[r:relation]-()
WITH r
LIMIT 1000000
DELETE r
RETURN count(*);