2015-11-03 93 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自從星期一開始使用它。 –

相關問題