정보공간_1

[5기 신촌 정구원] Neo4j & Cypher Query Language #3 본문

IT 놀이터/Elite Member Tech & Talk

[5기 신촌 정구원] Neo4j & Cypher Query Language #3

알 수 없는 사용자 2014. 6. 8. 23:38

1. Neo4j 고유 id 사용

Node 또는 Relationship을 조회하기 위해서는 일반적으로 label 또는 relationship type property 값을 이용하여 원하는 정보를 조회합니다. 하지만 대용량의 데이터베이스에서 원하는 조건에 맞는 정보를 빠르게 조회하는 것은 쉽지 않은 일입니다. 또한, node를 찾은 뒤 다시 그 node에 연결된 relationship을 찾고, 또 그에 연결된 node를 찾는 등 복잡한 과정을 통해 정보를 조회하게 되면 시간은 점점 더 오래 걸릴 수 밖에 없습니다.

하지만 Neo4j에서 제공하는 고유 id를 사용하면 특정 node relationship에 빠르게 접근할 수 있습니다. 고유 id node 또는 relationship 생성 시 자동으로 할당되며, 이를 얻기 위한 방법은 다음과 같습니다.

 

Cypher Query Language에서 제공하는 함수 중 ID를 이용하면 node의 고유 id를 얻을 수 있습니다. Relationship도 같은 방법으로 고유 id를 얻을 수 있습니다. 위 쿼리의 예상 결과는 다음과 같습니다.

 

이제 두 가지 방법으로 강백호라는 사람이 싫어하는 사람의 이름을 확인해보겠습니다.

먼저, label property를 이용하여 node를 찾고, 그에 연결된 relationship을 통해 찾는 방법입니다.

 

결과로 서태웅이라는 문자열을 얻을 수 있습니다.

 

다음은 고유 id를 알고 있을 경우입니다. 위의 그림에서 알 수 있듯이, 현재 강백호’ node의 고유 id 0번입니다. 따라서 다음과 같이 쿼리를 작성합니다.

 

Cypher Query Language에서 제공하는 NODE라는 함수를 통해 입력으로 고유 id를 주면 해당 node를 바로 찾을 수 있습니다. 따라서 n이라는 변수에 START 문에서 원하는 node를 먼저 찾고, `Hate` typerelationship을 이용하여 싫어하는 사람에 대한 node를 찾은 뒤 이름을 출력해보았습니다. 결과는 물론 위의 결과와 동일합니다.

 

데이터베이스의 크기가 작은 경우에는 별 다른 차이를 느낄 수 없지만, 크기가 커지면 커질수록 탐색 시간이 증가하므로, 조회를 원하는 node 또는 relationship의 고유 id를 알고 있다면 아주 빠른 시간에 정보를 조회할 수 있습니다.

 

2. Cache

다른 데이터베이스와 마찬가지로, Neo4j cache를 지원합니다. 지원하는 cache는 크게 두 종류가 있는데, File buffer cache Object cache가 바로 그것입니다.

먼저 File buffer cachelow level cache 또는 file system cache라고도 불립니다. Neo4jfile buffer cache에 데이터를 쓰고, logical log rotate 될 때까지 durable writing(DB에 최종 반영)하는 것을 미루게 됩니다. , cache에 계속해서 정보를 쓰고, 가득 찬 후에야 실제 DB에 반영하게 됩니다. 물론, crash가 날 수 있으나, logical log에도 함께 기록하고 있으므로, 이후에 문제없이 복구할 수 있습니다. 따라서 file buffer cache를 크게 설정하면 할수록 I/O 시간이 줄어들어 성능의 향상을 얻을 수 있습니다. 설정 가능한 file buffer cache의 종류는 다음과 같습니다.

 

두 번째로, Object cachehigh level cache로도 불리며, node relationship을 탐색함에 있어서, 빠른 탐색에 최적화 된 형태의 속성을 cache합니다. , 빠른 탐색을 위해 이전에 탐색했던 내용을 기록해 놓는다는 내용입니다. Neo4j에서는 Object cache type으로 총 5가지를 지원합니다. none, soft, weak, strong 그리고 hpc(high performance cache)가 바로 그것입니다.


상세하게 설정할 수 있는 type hpc 이지만, Enterprise Edition에서만 사용 가능한 type인 점을 확인하시고 사용하시기 바랍니다. 그 이외의 type Community Edition에서도 사용 가능하며, 프로젝트의 성향에 맞는 type을 선택해서 사용하시길 바랍니다. 만약 그렇지 않을 경우, cache의 누적으로 인해 OOME(Out Of Memory Error)가 발생할 수 있습니다.

 

3. Cypher Query Language Test

만약 어떤 Cypher Query Language를 테스트 해보려면 Neo4j Community 프로그램을 켜고, 서버를 작동시킨 뒤, 거기에 DB또한 비어 있는 상태라면, noderelationship들을 추가한 후에나 테스트를 해볼 수 있을 것입니다. 이건 매우 귀찮은 작업이 될 것이라고 생각합니다.

하지만 좀 더 쉽게 테스트 해볼 수 있는 방법이 있습니다. Cypher Query Language Manual site에 가 보면, 여러 가지 manual들이 있습니다.

 

자세히 살펴보면, 빨간색 박스로 표시한 부분을 발견하실 수 있습니다. 이 버튼을 누르게 되면, 아래 그림과 같이 내용이 펼쳐집니다.


위 그림에서 나타낸 그래프가 실제로 Neo4j에 이미 저장되어 있으며, Cypher Query를 사용할 수 있는 콘솔도 함께 제공해주어 실시간으로 결과를 확인할 수 있습니다. 이러한 예제는 Manual 곳곳에 숨어있으므로, 자신이 테스트하려는 환경과 비슷한 예제를 찾아서 원하는 Cypher Query를 테스트 해볼 수 있습니다. 이 방법을 통해 많은 시간을 절약할 수 있을 것이라고 생각합니다.

 

이번 포스팅에서는 Neo4j Cypher Query Language를 사용할 때의 여러 가지 Tip에 대하여 알아보았습니다. 포스팅을 이것으로 마치며, 많은 도움이 되었기를 바랍니다.

감사합니다.


Reference

Neo4j

http://www.neo4j.org/

http://docs.neo4j.org/chunked/milestone/