2016-08-28 41 views
0

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

很多次导入只是挂起,几个小时内什么都不做。

编辑 - 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

我正在使用来自neo4j-shell的Load CSV命令。 – user2813165

+0

@ user2813165请务必通过*编辑您的问题*来添加详细信息,而不是通过在评论中嵌入(特别是代码/查询,这些评论相当难以理解)。我编辑了你的问题以包含评论中的csv-load,所以你应该现在删除评论。 –

回答

0

编辑

在第二次看,好像你想实现某种条件逻辑到您的插入。

它看起来像你想要做的是弄清楚,如果一个人存在与一个UID(从row.player_cardnum一些串联派生),并在这种情况下:人不存在和匹配失败,MERGE a:具有由row.player_cardnum给出的CardNumber的人员。

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

了解WHERE子句与前面的MATCH,OPTIONAL MATCHWITH相链接,并且仅影响链接的子句。

对于那个OPTIONAL MATCH上的那个WHERE,每个将始终为空,但更重要的是,您的行仍然存在,并且以下MERGE将始终发生在CSV中的所有行。这可能是您放缓的原因,因为它正在为所有行创建新的:Person节点。

如果你想完全空出一行时,在现有的OPTIONAL MATCH点击:人(所以MERGE不会在这种情况下发生),你需要添加一个WITH条款,并确保您的WHERE子句适用于它而不是OPTIONAL MATCH

此外,请确保您对Person.UID和Person.CardNumber具有唯一约束或索引。至于UID匹配,我听说索引不是在你匹配的东西的某种字符串连接时使用的,所以你可能需要先将它组合起来,然后用WITH传递它。

你最终的查询应该是这样的:

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() ; 
+0

谢谢,我会尝试这一个.. – user2813165

+0

首先用一些测试数据而不是LOAD CSV来测试它,以确保它符合你的期望,同时还有一个player_cardnum匹配一个:人,一个没有。 – InverseFalcon