데이터로 다시 읽는 조선시대 양반의 생활

지암일기 그래프 데이터베이스:

지암일기 Neo4j 데이터베이스 접속 및 활용


Neo4j™는 Neo Technology사에서 개발한 그래프 데이터베이스 관리시스템으로서 2007년 공식 발표되었습니다. 현재 Neo4j™는 GPL3 라이선스의 오픈 소스 커뮤니티 에디션으로 이용이 가능하며, 질의 언어 Cypher가 2016년 시작된 openCypher 프로젝트를 통해 표준적인 그래프 질의 언어로서 모색되고 있는 상황이기에, 현 시점에서 가장 대중적인 그래프 데이터베이스 가운데 하나라 할 수 있습니다. 보다 자세한 정보는 공식 사이트 방문을 통해 확인할 수 있습니다.

Neo4j™는 질의어(Query)를 이용해 원하는 데이터를 네트워크 그래프 형태로 출력할 수 있습니다. 질의어를 섬세하게 구성할 경우 원하는 정보에 보다 효과적으로 접근할 수 있습니다. 아래는 『지암일기』 그래프데이터베이스(Neo4j™)를 이용하기 위한 기본적인 방법을 정리한 것입니다.

그래프데이터베이스 초기 접속 시 데이터베이스 접속(Connect)을 위한 절차를 거쳐야 합니다. 접속화면 중간의 여러 입력 상자를 무시하고 하단의 “Connect” 버튼을 클릭하면 데이터베이스 접속이 이루어집니다.

접속이 성공적으로 이루어질 경우, 위와 같은 그래프데이터베이스 초기 화면을 확인할 수 있습니다. 『지암일기』 그래프데이터베이스를 이용하기 위한 기초 환경이 마련된 것이라 할 수 있습니다.

초기 화면에서 주목해야 할 것은 상단의 ‘질의어(Query) 입력박스’입니다. 원하는 내용의 정보를 그래프 형태로 출력하기 위해서는 그에 해당하는 구체적인 질의어를 상단의 박스에 입력해야 합니다.

위의 화면은 match (n) return n 이라는 질의어를 상단의 박스에 입력하고 박스 우측의 실행 버튼(삼각형 모양)을 클릭해서 질의를 실행한 결과입니다. match (n) return n 은 데이터베이스에 입력된 모든 정보를 선택해서 출력하라는 질의어입니다. 데이터베이스에는 8만 건이 넘는 데이터가 입력되어 있으나, 모든 데이터를 일시에 출력할 시 브라우저 상에서 과부하가 발생할 수 있기에 실제 화면상에 출력되는 데이터의 양은 옵션에 따라 제한적입니다.

질의어 상에서 match 라는 표현은 입력된 노드 데이터와 링크 데이터를 선택하는 키워드입니다. 이 키워드를 질의어에 반영해 노드와 링크 데이터 가운데 원하는 항목을 선택할 수 있습니다. 예를 들어 match 다음에 (n) 을 표기한 것은 변수로서 모든 데이터 항목을 선택하라는 의미입니다. 질의어 상의 return 은 선택된 데이터를 화면상에 출력하는 키워드입니다. return 을 활용해 match 에서 선택된 데이터를 출력하여 확인할 수 있습니다.

위의 화면은 match (a:Person) return a 라는 질의어를 상단의 박스에 입력하고 박스 우측의 실행 버튼(삼각형 모양)을 클릭해서 질의를 실행한 결과입니다. match (a:Person) return a 는 데이터베이스에 입력된 정보 가운데 라벨(label)이 ‘Person’인 항목을 선택해서 출력하라는 질의어입니다. 현재 그래프 데이터베이스상의 라벨은 데이터베이스 설계 내용의 클래스(Class) 항목을 그대로 반영해 놓았습니다.

위의 화면은 match (a) where a.korname=“윤이후” return a 라는 질의어를 상단의 박스에 입력하고 박스 우측의 실행 버튼(삼각형 모양)을 클릭해서 질의를 실행한 결과입니다. match (a) where a.korname=“윤이후” return a 는 데이터베이스에 입력된 정보 가운데 한글명칭(korname)이 ‘윤이후’인 항목을 선택해서 출력하라는 질의어입니다. 예시 구문을 통해 유추할 수 있듯이 where 은 데이터 선택에 있어서 조건을 걸 수 있는 키워드입니다.

위의 화면은 match (a) - [r:hasSon] -> (b) where a.korname="윤이후" return a, r, b 라는 질의어를 상단의 박스에 입력하고 박스 우측의 실행 버튼(삼각형 모양)을 클릭해서 질의를 실행한 결과입니다. match (a) - [r:hasSon] -> (b) where a.korname="윤이후" return a, r, b 는 데이터베이스에 입력된 정보 가운데 한글명칭(korname)이 ‘윤이후’인 항목을 기준으로 해당 항목과 부자 관계(hasSon)에 있는 데이터를 선택해서 출력하라는 질의어입니다. 출력된 내용을 살펴보면 윤이후를 중심으로 그의 자식들인 윤창서, 윤흥서, 윤종서, 윤두서, 윤광서 5인의 인물 데이터가 출력된 것을 알 수 있습니다.

그리고 위의 이미지에서 볼 수 있듯이 네트워크 그래프 상에서 개별 노드 데이터 항목을 마우스로 더블 클릭할 경우 해당 데이터를 기준으로 연결된 1단계 링크의 데이터들이 화면상에 출력됩니다. 상단의 질의어 입력 박스 뿐만 아니라 그래프상의 노드 데이터를 마우스로 직접 다룰 수 있다는 것이 그래프 데이터베이스(Neo4j)의 특징입니다. 데이터베이스를 효과적으로 활용하기 위해 더욱 정교한 질의어 작성을 도모하고자 한다면 Neo4j가 제공하는 Neo4j Cypher Manual의 내용을 참고할 수 있습니다.

모든 데이터를 출력:
match (n) return n
라벨(Label, Class 항목 반영)이 ‘Person(인물)’에 속하는 데이터를 출력:
match (a:Person) return a
라벨(Label, Class 항목 반영)이 ‘Event(사건)’에 속하는 데이터를 출력:
match (a:Event) return a
라벨(Label, Class 항목 반영)이 ‘Place(공간)’에 속하는 데이터를 출력:
match (a:Place) return a
한글명칭(korname) 값이 ‘윤이후’인 데이터를 출력:
match (a) where a.korname=“윤이후” return a
성씨(clan) 값이 ‘해남윤’인 인물 데이터를 출력:
match (a:Person) where a.clan=“해남윤” return a
한글명칭(korname) 값이 ‘윤이후’인 노드 항목을 기준으로 해당 항목과 부자 관계(hasSon)를 맺고 있는 모든 노드 데이터를 출력:
match (a) - [r:hasSon] -> (b) where a.korname="윤이후" return a, r, b
한글명칭(korname) 값이 ‘윤이후’인 데이터를 기준으로 1단계 관계를 맺고 있는 인물 데이터를 출력:
match (a{korname:'윤이후'}) - [r] -> (b:Person) return a, r, b
한글명칭(korname) 값이 ‘윤이후’인 데이터를 기준으로 2단계 관계를 맺고 있는 인물(Person) 데이터를 출력:
match (a{korname:'윤이후'}) <- [r] -> (b:Person) <- [s] -> (c:Person) return a, r, b, s, c
한글명칭(korname) 값이 ‘윤이후’인 데이터를 기준으로 2단계 관계를 맺고 있는 인물(Person) 데이터를 출력:
match (a{korname:’윤이후’}) <- [*..2] -> (b:Person) return a, b
한글명칭(korname) 값이 ‘윤이후’인 데이터를 기준으로 x단계 관계를 맺고 있는 인물(Person) 데이터를 출력:
match (a{korname:’윤이후’}) <- [*..x] -> (b:Person) return a, b
한글명칭(korname) 값이 ‘윤이후’인 데이터를 기준으로 해당 항목이 소유 관계(hasOwner)를 맺고 있는 노비(Slave) 데이터를 출력:
match (a:Slave) – [r:hasOwner] -> (b) where b.korname=“윤이후“ return a