2016-04-03 90 views
0

我试图将数据从MySQL数据库导入到Neo4j,使用CSV文件作为中介。我正在关注basic example,但无法完成它的工作。我正在用这些查询导入两个表格:将CSV关系导入到Neo4j

//Import projects. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/projects.csv" AS row 
CREATE (:project 
{ 
    project_id: row.fan, 
    project_name: row.project_name 
}); 

//Import people. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/persons.csv" AS row 
CREATE (:person 
{ 
    person_id: row.person_id, 
    person_name: row.person_name, 
}); 

//Create indicies. 
CREATE INDEX ON :project(project_id); 
CREATE INDEX ON :project(project_name); 
CREATE INDEX ON :person(person_id); 
CREATE INDEX ON :person(person_name); 

此部件适用。当我尝试导入关系时,不起作用的是:

//Create project-person relationships. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/project_persons.csv" AS row 
MATCH (project:project {project_id: row.project_id}) 
MATCH (person:person {person_id: row.person_id}) 
MERGE (person)-[:CONTRIBUTED]->(project); 

控制台接受没有错误的查询,但从未结束。它在100%CPU,25%RAM下运行数天,但磁盘使用率可以忽略不计。数据库信息中没有关系。

我在某个地方犯了错,还是真的这么慢? project_persons.csv文件长度为1300万行,但不应该定期提交现在显示的内容吗?

回答

0
shouldn't the periodic commit make something show up by now? 

仅适用于LOAD - 做一个“解释”在前面的创建,它会告诉你它是如何构建的更新和预计处理记录#。我遇到了同样的问题 - Neo4j将整个更新作为单个事务进行,并且从未完成。交易需要分解成5万到10万个tx块以完成一切。

执行此操作的一种方法是将关系信息作为一组标记节点导入,然后使用这些节点来MATCH()人员和项目节点并根据需要创建关系。这种多次

MATCH (r:Relations) 
MATCH (prj:project {project_id: r.project_id}) 
MATCH (per:person {person_id: r.person_id}) 
WITH r, prj, per LIMIT 50000 
MERGE (per)-[:CONTRIBUTED]->(prj) 
DELETE r 

运行,直到创建了所有的关系,你是好去:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/project_persons.csv" AS row 
CREATE (:Relations {project_id: row.project_id, person_id: row.person_id}) 

然后在50K批量处理的记录。

+0

它可以工作,但即使增加了限制,导入所有数据也很乏味。由于某种原因,我有剩余的200k关系,不会合并或删除。 – Rachie

+0

同意单调乏味。你在做什么来删除不需要的关系? –

+0

我不知道如何处理它们,或者即使它们是不需要的。 – Rachie