Neo4j大型数据集的性能

时间:2016-08-28 05:59:47

标签: neo4j cypher

我正在尝试将大型数据集加载到neo4j-3中并寻找选项。我发现了一个neo4j-import,但问题在于它只适用于初始加载。我必须每周加载2M记录。 我尝试通过shell加载,但有一些性能问题,我试着跟随。 1)预先创建约束。 2)在单独的查询中创建节点和关系。 3)堆积空间8G 4)dbms.memory.pagecache 4G

很多时候,导入只会挂起并且几个小时都不会发生任何事情。

修改 - 正在执行的CSV加载:

USING PERIODIC COMMIT 5000
LOAD CSV WITH HEADERS
FROM "file:///my_sds_39_joe.csv"
AS row
OPTIONAL MATCH (per:Person {UID : "Person."+row.player_cardnum})
WHERE per IS NULL
MERGE (p:Person {CardNumber : row.player_cardnum})
ON CREATE SET p.Creation Date = timestamp(), p.Modification Date = timestamp() ;

1 个答案:

答案 0 :(得分:0)

修改

再看看,您似乎正在尝试为插入实现某种条件逻辑。

看起来你正在尝试做的是弄清楚:人是否存在UID(从与row.player_cardnum的某些串联中派生),并且在这种情况下:人不会这样做存在并且匹配失败,MERGE a:具有由row.player_cardnum给出的CardNumber的人。

如果这是您的目标,那么您的查询几乎就在那里。问题在于你的WHERE条款。

了解WHERE子句与之前的MATCHOPTIONAL MATCHWITH相关联,并且仅影响链接子句。

使用WHERE上的OPTIONAL MATCH,per将始终为null,但更重要的是,您的行仍然存在,并且以下MERGE将始终用于所有行CSV。这可能是你减速的源头,因为它创造了新的:所有行的人员节点。

如果您OPTIONAL MATCH点击现有的人员(因此MERGE在这种情况下不会发生这种情况),那么您将尝试完全取消该行,您就是&# 39; ll需要添加WITH子句,并确保将WHERE子句应用于OPTIONAL MATCH而不是WITH

此外,请确保在Person.UID和Person.CardNumber上有唯一约束或索引。至于UID匹配,我听说当你匹配的东西有某种字符串连接时不使用索引,所以你可能需要首先组装它并传递它使用USING PERIODIC COMMIT 5000 LOAD CSV WITH HEADERS FROM "file:///my_sds_39_joe.csv" AS row // first build the UID so we can take advantage of the index WITH row, "Person." + row.player_cardnum AS UID OPTIONAL MATCH (per:Person {UID : UID}) // the WHERE now applies to the WITH, which will filter out and null out the row when an OPTIONAL MATCH is found WITH row, per WHERE per IS NULL MERGE (p:Person {CardNumber : row.player_cardnum}) ON CREATE SET p.Creation Date = timestamp(), p.Modification Date = timestamp() ;

您的最终查询将如下所示:

SELECT id FROM table WHERE 'active' = 1