2017-11-24 15 views
0

neo4jを評価しています。他のDBと比較するためにランダムなデータを作成しました。データは、10k、100k、および1mノードのツリー構造を表します。階層型とリンクされたリストのような接続チェーン関係の2つの関係タイプがあります。neo4jで500kノードと1mリレーションを含むサブツリーのコピーを作成します。

私がテストしたい操作の1つは、サブツリーのコピーを作成することです。この操作は、3つのステップ(ノードのコピー、コピー関係、ターゲットへの接続)で実行されます。この操作は、10kと100kのツリーで正常に動作します。しかし、500kのコピーツリーを持つ最大の例では、neo4jは決して戻ってこない。

ブラウザに再接続が行われていると表示され、何も起こりません。私は500kノードはそれほど大きくはないはずだと思います。 cvsファイルのテストデータは約300MBです。

私は間違っていますか?

1:コピーノード

match (r {`domain key` : 'unit-B2'})-[:isPredecessorOf*0..]->(n:`T-Base`) 
with n as map create (copy:`T-Base`) 
set copy = map, copy.`domain key` = map.`domain key` + '-copy' 
with map, copy 
create (copy)-[:isCopyOf]->(map) 

2:コピー関係

match (s {`domain key` : 'unit-B2'})-[:isPredecessorOf*0..]->(n) 
with collect(n) as st, s 
match (s)-[:isPredecessorOf*0..]->(t)-[r:`isPredecessorOf`]->(x) 
where x in st 
with startNode(r) as s, endNode(r) as d 
match (s)<-[:isCopyOf]-(source), (d)<-[:isCopyOf]-(dest) 
with source, dest 
create (source)-[:isPredecessorOf]->(dest) 

match (s {`domain key` : 'unit-B2'})-[:isPredecessorOf*0..]->(n) 
with collect(n) as st, s 
match (s)-[:isPredecessorOf*0..]->(t)-[r:`isConnectedTo`]->(x) 
where x in st 
with startNode(r) as s, endNode(r) as d 
match (s)<-[:isCopyOf]-(source), (d)<-[:isCopyOf]-(dest) 
with source, dest 
create (source)-[:isConnectedTo]->(dest) 

3:ノード

match (source{`domain key`:'unit-B1'}), (dest{`domain key`:'unit-B2-copy'}) 
create (source)-[:isPredecessorOf]->(dest) 
+0

どのようにNeo4jを実行しますか?たぶんトランザクションメモリのメモリ構成の問題です。 –

+0

これはWindowsサービスとして実行されます。サーバーのメモリは18GBです。 dbms.memory.heap.initial_size = 10g dbms.memory.heap.max_size = 10g dbms.memory.pagecache.size = 6g – Jacek

答えて

0
  1. どのようにしてのNeo4jを実行するかをターゲットにコピーツリーのルートを接続します?たぶんトランザクションメモリのメモリ構成の問題です。 1Mレコードの場合、約4Gのヒープ設定が必要です。
  2. rとsのラベルを使用する必要があります。
  3. は、2番目のステートメントを2つのステートメントに区切ります。

より大きなトランザクション更新が必要な場合は、apocプロシージャをインストールし、apoc.periodic.iterateを使用してバッチで更新を実行できます。

call apoc.periodic.iterate(' 
match (r:Label {`domain key` : 'unit-B2'})-[:isPredecessorOf*0..]->(n:`T-Base`) 
return distinct n as map 
',' 
create (copy:`T-Base`) 
set copy = map, copy.`domain key` = map.`domain key` + '-copy' 
with map, copy 
create (copy)-[:isCopyOf]->(map) 
',{batchSize:10000,iterateList:true}) 
+0

答えがありがとう、apoc.periodic.iterateはトリックを行いました。 2つのステートメントとして実行されますが、私はそれを定期的にも変換しました。 dbms.memory.heap.initial_size = 10g、dbms.memory.heap.max_size = 10g、dbms.memory.pagecache.size = 6g?私のテストの結果、neo4jは500000の修正されたオブジェクトと同じ大きさのトランザクションに対処できないと思いますか?私は時にはそれがうまくいくことを意味します。それにもかかわらず、データのバッチ処理は今のところうまくいきます。 – Jacek

関連する問題