neo4j - cypher - apoc.periodic.iterate

1 분 소요

neo4j - job management

  • DB를 전반적으로 관리할 권한을 가지고 있지 않고, 그저 데이터를 읽는 정도로만 사용할 때는 문제가 없지만, DB의 데이터 일관성과 같은 것들을 면밀하게 관리해야 할 때는 중요한 것은 일종의 load-balancing 이죠. 늘 말하지만, 데이터베이스에는 무한에 가까운(사실은 무한이 아니지만, 이렇게 생각해야 할정도로 아득히 큰 값들이 들어있으니까요), 데이터들이 들어있고, 이 데이터를 한번에 변경할 경우, 데이터베이스 자체가 터질 수도 있습니다. 뿐만 아니라, 만약 쓸 때 lock이 걸린다면, 데이터를 종료될때까지 날아가는 transaction들의 수는 또 상상을 초월하게 되죠.
  • 따라서, 필요에 따라, 명령어가 주기적으로 분할하여 작업이 실행되는 것이 필요하며, 이를 위해 neo4j에서는 apoc.periodic.iterate라는 커맨드를 지원합니다.

Periodic Execution

CALL apoc.periodic.iterate(
    // first command 
    // 2번째 커맨드가 적용되어야 하는 대상.
    "MATCH (p:Person) WHERE (p)-[:ACTED_IN]->() RETURN p",
    // second command
    // 첫번째 커맨드에 무엇을 적용할 것인가?
    "SET p:Actor",
    // config: 
    // 
    {batchSize:10000, parallel:true}
)
  • config에 대한 설명은 다음과 같습니다. 다른 것들도 많은데, 뭐, 이 둘 말고는 필요하지 않은 것 같아서 제외하였습니다.
    • batchSize: 한번에 second statement를 몇 개나 적용할 것인가?
    • parallel: second statement가 병렬로 돌아가게 할 것인가?

wrap-up

  • apoc가 무슨 약자인지 봤더니, Awesome Procedure On Cypher이더군요…
  • 이런 식의 이름을 가진 라이브러리에 그냥 넣어두는 것은 사실, 좋은 설계가 아닌데, 그냥 일단은 여기에 둔 것 같아요. Powered by Neo4j Labs. 라는 글도 적혀 있는 걸로 봐서는, 일종의 테스트 버전을 삭 넣어둔 것으로 보입니다.

댓글남기기