2017-01-28 19 views
0

私はNeo4jプロシージャを使用してバルクデータにリレーションシップを作成しています。Neo4j一括データ - リレーションシップの作成[OutOfMemory例外]

まず、すべてのデータをload csvを使用して挿入します。

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM "file:///XXXX.csv" AS row 
.... 

データサイズが大きすぎる[10M]であるが、そのが正常に

を実行し、私の問題は、私はすべてのノードに多く、多くの

をこの間の関係を作成したいが、私は例外[OutMemoryException]しばらく持っています実行するクエリ

MATCH(n1:x{REMARKS :"LATEST"}) MATCH(n2:x{REMARKS :"LATEST"}) WHERE n1.DIST_ID=n2.ENROLLER_ID CREATE (n1)-[:ENROLLER]->(n2) ; 

私はすでにインデックスとも制約

を作成しました

何か助けてください?

答えて

1

クエリは1つのトランザクションで実行されるため、例外は[OutMemoryException]になります。これは問題です。この時点では、定期的なトランザクションの可能性はCSVをロードするだけで済むからです。だから、あなたは、例えば、CSV最初のロード後に再読み込みすることができます

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM "file:///XXXX.csv" AS row 
MATCH (n1:x{REMARKS :"LATEST", DIST_ID: row.DIST_ID}) 
WITH n1 
MATCH(n2:x{REMARKS :"LATEST"}) WHERE n1.DIST_ID=n2.ENROLLER_ID 
CREATE (n1)-[:ENROLLER]->(n2) ; 

またはAPOC libraryからperiodic committingでトリックを試してみてください。

call apoc.periodic.commit(" 
    MATCH (n2:x {REMARKS:'Latest'}) WHERE exists(n2.ENROLLER_ID) 
    WITH n2 LIMIT {perCommit} 
    OPTIONAL MATCH (n1:x {REMARKS:'Latest'}) WHERE n1.DIST_ID = n2.ENROLLER_ID 
    WITH n2, collect(n1) as n1s 
    FOREACH(n1 in n1s| 
     CREATE (n1)-[:ENROLLER]->(n2) 
    ) 
    REMOVE n2.ENROLLER_ID 
    RETURN count(n2)", 
    {perCommit: 1000} 
) 

P.S. ENROLLER_IDプロパティは、処理するノードを選択するためのフラグとして使用されます。もちろん、処理中に設定されている別のフラグを使用することもできます。

それともapoc.periodic.iterateと、より正確な:

CALL apoc.periodic.iterate(" 
    MATCH (n1:x {REMARKS:'Latest'}) 
    MATCH (n2:x {REMARKS:'Latest'}) WHERE n1.DIST_ID = n2.ENROLLER_ID 
    RETURN n1,n2 
    "," 
    WITH {n1} as n1, {n2} as n2 
    MERGE (n1)-[:ENROLLER]->(n2) 
    ", {batchSize:10000, parallel:true} 
) 
+0

返信するありがとうございました。 – nmkkannan