neo4j LOAD CSV用python导入数据方法

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(*);

你可能感兴趣的:(python,neo4j,机器学习)