2017-11-24 6 views
0

neo4j를 평가 중입니다. 다른 dbs와 비교할 임의의 데이터를 만들었습니다. 데이터는 10k, 100k 및 1m 노드가있는 트리 구조를 나타냅니다. 계층 구조 유형과 연결 목록과 같은 연결 체인 관계의 두 가지 관계 유형이 있습니다.neo4j에서 500k 노드와 1m 관계를 포함하는 하위 트리를 복사하십시오.

테스트하려는 작업 중 하나는 하위 트리의 복사본을 만드는 것입니다. 이 작업은 세 단계 (노드 복사, 관계 복사, 대상에 연결)로 수행됩니다. 이 작업은 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 복사 : 당신이 Neo4j를 실행하려면 어떻게 노드를

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. 을 대상으로 복사 나무의 뿌리를 연결 ? 트랜잭션 메모리의 메모리 구성 문제 일뿐입니다. 1M 레코드의 경우 약 4G 힙 구성이 필요합니다.
  2. 레이블에 r과 s를 사용해야합니다.
  3. 두 번째 문장을 두 문장으로 분리하십시오.

더 큰 트랜잭션 업데이트가 필요한 경우 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가 트릭을했는데 두 번째 단계는 이미 완료되었습니다. 두 문장으로 실행했지만 주기적으로도 변환했습니다. 데이터 양에 따라 다음과 같은 구성이 충분합니까? dbms.memory.heap.initial_size = 10g, dbms.memory.heap.max_size = 10g, dbms.memory.pagecache.size = 6g? 내 테스트 결과로 neo4j는 500000 개의 수정 된 객체만큼 큰 트랜잭션을 처리 할 수 ​​없다고 생각할 수 있습니까? 나는 때로는 효과가 있고 때로는 그렇지 않다는 것을 의미합니다. 그럼에도 불구하고 데이터 일괄 처리는 지금 당장 작동합니다. – Jacek