我有几个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个多小时才能完成,而且似乎过于缓慢。我还能做些什么来加快速度呢?或者使用看起来很烦人的导入工具是否有意义?
答案 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
})