我应该使用Neo4j的导入工具或加载命令来插入几百万行吗?

时间:2015-04-24 21:40:34

标签: csv neo4j graph-databases

我有几个CSV文件,大小从25到100 MB不等。我创建了约束,创建了索引,使用了定期提交,并增加了neo4j-wrapper.conf和neo4j.properties中分配的内存。

neo4j.properties:

neostore.nodestore.db.mapped_memory=50M
neostore.relationshipstore.db.mapped_memory=500M
neostore.propertystore.db.mapped_memory=100M
neostore.propertystore.db.strings.mapped_memory=100M
neostore.propertystore.db.arrays.mapped_memory=0M

neo4j-wrapper.conf更改:

wrapper.java.initmemory=5000
wrapper.java.maxmemory=5000

但是我的负载仍然需要很长时间,我正在考虑使用最近发布的导入工具(http://neo4j.com/docs/milestone/import-tool.html)。在我切换到它之前,我想知道我是否可以做任何其他事情来提高我的进口速度。

我首先创建了几个约束,以确保我使用的ID是唯一的:

CREATE CONSTRAINT ON (Country) ASSERT c.Name IS UNIQUE;
//and constraints for other name identifiers as well..

然后我使用定期提交...

USING PERIODIC COMMIT 10000

然后我在CSV中加载,我忽略了几个字段

LOAD CSV WITH HEADERS FROM "file:/path/to/file/MyFile.csv" as line
WITH line
WHERE line.CountryName IS NOT NULL AND line.CityName IS NOT NULL AND line.NeighborhoodName IS NOT NULL

然后我从我的数据中创建必要的节点。

WITH line
MERGE(country:Country {name : line.CountryName})
MERGE(city:City {name : line.CityName})
MERGE(neighborhood:Neighborhood {
     name : line.NeighborhoodName,
     size : toInt(line.NeighborhoodSize),
     nickname : coalesce(line.NeighborhoodNN, ""),
     ... 50 other features
    })

MERGE (city)-[:IN]->(Country)
CREATE (neighborhood)-[:IN]->(city)
//Note that each neighborhood only appears once

使用CREATE UNIQUE而不是将MERGE应用于任何COUNTRY引用是否有意义?这会加速吗?

一个〜250,000行的CSV文件需要12个多小时才能完成,而且似乎过于缓慢。我还能做些什么来加快速度呢?或者使用看起来很烦人的导入工具是否有意义?

1 个答案:

答案 0 :(得分:1)

有几件事。首先,我建议阅读马克·尼达姆"避免渴望"博客文章:

http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

基本上它说的是你应该在每个查询的开头添加PROFILE,看看是否有任何人使用Eager运算符。如果他们这样做可能会让您在性能方面付出代价,您应该将查询分成单独的MERGE s

其次,您的邻居MERGE包含许多属性,因此每次尝试匹配这些属性中的每一个属性,然后再决定是否应该创建它。我建议像:

MERGE (neighborhood:Neighborhood {name: line.NeighborhoodName})
ON CREATE SET
     neighborhood.size = toInt(line.NeighborhoodSize),
     neighborhood.nickname = coalesce(line.NeighborhoodNN, ""),
     ... 50 other features
    })