2015-11-03 285 views
1

我需要创建与50个节点(:office)有一些关系的50000个节点(:Person),确保:office元素不具有重复元素,但是:Person具有。如何在neo4j中有效地创建与关系非重复的节点?

我的代码如下所示:

CREATE INDEX ON :office(rc) 
CREATE INDEX ON :Person(numDoc) 
USING PERIODIC COMMIT 500 LOAD CSV FROM 
"file:///path/to/file" AS csvLine 
MATCH (x:office{ rc:"345421"}) 
MERGE (n:Person { numDoc: toint(csvLine[1]) }) 
CREATE (n) -[:Afil]-> (x) 

它的实际工作,但它需要这么多的时间(约2小时)。我想知道一个有效的方式来作出这个查询

回答

3

请使拼写/大小写一致。 尝试使用的Neo4j 2.3.0

CREATE INDEX ON :Office(rc); 

CREATE INDEX ON :Person(numDoc); 

// make sure the indexes are online 

:schema await 

MATCH (x:Office{ rc:"345421"}) 
LOAD CSV FROM "file:///path/to/file" AS csvLine 
MERGE (n:Person { numDoc: toInt(csvLine[1]) }) 
CREATE (n) -[:Afil]-> (x); 

如果你只创建人50K和50K关系,你不需要定期提交。然后,您可以一次预先匹配办公室,而不是每行。

如果使用您创建的索引,您可以通过EXPLAIN预先检查查询。

+0

谢谢!我没有注意到我是匹配每一行!当创建和索引它存储在一些数据结构中的节点,以使匹配更快?或做一些不同的事情。 –

+1

如果您想提高性能,您应该使用批量导入程序 –

1

你有索引适当的MATCH/MERGE子句?

CREATE INDEX ON :Office(rc) 
CREATE INDEX ON :Person(numDoc) 

另外,在我看来,500的TX尺寸可能太小。 你有没有试过把它增加到10000?

USING PERIODIC COMMIT 10000 

您可能想要查看的另一件事是您的记忆设置。你有足够的页面缓存和堆Neo4j有效地运行?

+0

嗯所以使用索引是减少时间的唯一途径?索引如何减少时间?它是否使某种散列或一些数据结构来存储数据? –

+0

您使用的是哪个版本的neo4j? –

+0

@AlessandroNegro 2.3.0自从星期一开始使用它。 –

相关问题