정보공간_1

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

IT 놀이터/Elite Member Tech & Talk

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

알 수 없는 사용자 2014. 6. 8. 20:37

1. Neo4j의 구성 요소

Neo4j는 크게 node relationship으로 구성되어 있습니다. Node graph에서 vertex(정점)에 해당하며, 하나의 entity를 나타냅니다. Relationship graph에서 edge(간선)에 해당하며, node 사이의 상관관계를 의미합니다. , Neo4j(Graph) Node(vertex) Relationship(edge)들의 집합이며, 이를 통해 데이터를 저장하고 관리합니다.

 

Node는 크게 3가지의 정보를 저장할 수 있습니다.




첫 번째는 ‘Relationship’ 입니다. Relationship은 두 node 사이의 상관관계를 나타냅니다. 자세한 내용은 아래에서 다루도록 하겠습니다.

두 번째는 ‘Label’입니다. Label node의 카테고리를 정해주는 역할을 합니다. 같은 node라고 하더라도, 서로 다른 카테고리에 속해있을 수 있습니다. 물론 다음에 소개할 property에 이 정보를 저장할 수도 있지만, 원하는 카테고리만 선택하여 결과를 얻고 싶은 경우에 label은 성능 측면에서 강력한 힘을 발휘합니다. 만약 데이터베이스의 크기가 굉장히 크고, label이 설정되어 있지 않다고 한다면, 특정 property로 원하는 정보를 얻기 위해서는 모든 node들을 일일이 확인하여 찾아야 하지만, label이 설정되어 있는 경우에는 이미 분류가 되어 있으므로 해당 카테고리에서만 특정 node를 찾을 수 있습니다. 물론, 하나의 node는 여러 개의 label을 가질 수도 있습니다. Label의 이름은 최소 한 글자 이상의 Unicode 문자열을 지원합니다.



 

마지막은 ‘Property’입니다. Property node의 속성을 의미하며, node별로 각기 가지고 있는 정보를 저장할 수 있도록 도와줍니다. label과는 달리 단순히 node의 정보를 저장하는 성격이 강합니다. Property key-value 쌍으로 이루어져 있고, 사용자가 지정한 key를 통해 property를 저장하거나 불러올 수 있습니다. 저장할 수 있는 value의 형태로는 정수, 실수, 문자, 문자열 및 이들의 배열 등이 있습니다.



 

예를 들어, ‘나이가 27살이고, 이름이 홍길동인 사람이라는 node를 생성한다면, label로는 Person이라는 값을 주고, Property로는 이름과 나이를 설정할 수 있습니다.

Cypher Query:

CRETAE (n:`Person` {name:'홍길동', age:27})

RETURN n

 

다음은 Relationship입니다. Relationship은 총 4가지의 정보를 저장할 수 있습니다.



첫 번째와 두 번째는 ‘Start node’‘End node’입니다. Relationship node와는 달리 독립적으로 존재할 수 없으며, 항상 두 개의 node 사이에 존재해야 합니다. 해당 정보는 Cypher Query Language를 이용하여 relationship을 삽입할 때 쿼리 문장에서의 위치 및 화살표의 방향에 의해 결정됩니다. 자세한 내용은 아래에서 다시 다루도록 하겠습니다.

세 번째는 ‘Relationship type’입니다. Relationship type node label과 마찬가지로, relationship들을 카테고리화 하는 역할을 하며, 해당 relation이 어떤 관계를 나타내는지를 의미합니다.

마지막으로 node와 마찬가지로 relationship‘Property’들을 저장할 수 있습니다.

 

예를 들어, ‘나이가 27살인 김철수 라는 사람이 나이가 24살인 김영희 라는 사람에게 책을 주었다라는 내용을 표현하면 아래와 같이 될 수 있습니다.

Cypher Query:

CREATE (a:`Person` {name:'김철수', age:27})

CREATE (b:`Person` {name:'김영희', age:24})

CREATE (a)-[r:`Give` {what:''}]->(b)

RETURN a, r, b


 

2. Cypher Query Language

Cypher는 선언적 그래프 쿼리로, 효과적으로 graph database를 업데이트 할 수 있도록 도와줍니다. 쿼리의 형태는 실제 node relation의 관계를 그대로 표현하고 있으므로, 몇 가지의 키워드만 알면 쉽게 사용할 수 있습니다. 다양한 기능들을 제공해주며 그 만큼 많은 키워드 들이 있지만, 가장 기본이 되며 많이 사용하는 CREATE MATCH에 대해 알아보겠습니다.

 

2-1. CREATE

DB를 사용하려면 먼저 node relation을 생성해야 합니다. 이를 위해 사용하는 키워드가 바로 ‘CREATE’입니다. 이 키워드를 통해서 node relation 모두를 생성할 수 있습니다.

 

먼저 CREATE라는 키워드를 통해 그 이후의 것을 생성할 것임을 명시합니다. ()로 묶인 부분이 새롭게 생성할 node를 나타냅니다. n node를 나타내는 변수로 볼 수 있습니다. 변수 이름 뒤에 나오는 :(콜론) label을 지정하기 위한 역할입니다. , label의 이름으로 Person이 사용되었음을 알 수 있습니다. {}로 묶인 부분은 node property들을 의미합니다. JSON Object와 같은 양식으로 property들을 입력합니다. 마지막의 RETURN 키워드는 결과를 보기 위해 방금 생성한 node n을 반환하는 역할을 합니다. 쿼리의 결과는 위에서 확인하실 수 있습니다.

 

Relationship은 독립적으로 추가할 수 없으므로, 2개의 node를 먼저 생성한 뒤, 해당 node들 사이의 관계를 정의하는 형태로 생성합니다. Relationship–[]->로 나타내며, 화살표의 방향대로 관계가 있음을 나타냅니다. [] 안에는 node와 마찬가지로 :(콜론) 뒤에는 ‘relation type’, {}에는 relationship property들을 입력합니다. 쿼리의 결과는 마찬가지로 위에서 확인하실 수 있습니다.

 

2-2. MATCH

DB를 생성했다면 이제 원하는 정보를 얻을 수 있어야 합니다. 이 때 사용하는 키워드가 ‘MATCH’ 키워드 입니다. 예제를 통해 사용법을 확인해보겠습니다.

    모든 node 조회

위의 예제와 마찬가지로, (n) node를 의미합니다. 이 때, 아무 조건을 주지 않았으므로 n은 모든 node를 나타냅니다. , 모든 node를 찾아서 반환하라는 쿼리가 됩니다. 결과는 다음과 같습니다.

 

    나이가 27살인 사람 조회

간단하게 property age:27 만을 추가하여 결과를 반환하도록 하였습니다. 결과는 다음과 같습니다.

 

    김철수가 김영희에게 준 물건의 이름 조회

김철수라는 이름을 property로 가진 node김영희라는 이름을 property로 가진 node를 연결하는 relationship‘Give’ type relationship을 찾고, 해당 relationship property what이라는 key를 이용하여 물건의 이름을 조회하는 쿼리입니다. 결과는 다음과 같습니다.

 

이번 포스팅에서는 Neo4j의 구성요소와 Cypher Query Language의 간단한 사용법에 대해 알아보았습니다. 다음 포스팅에서는 Neo4j 사용시의 여러 가지 Tip을 소개해드리도록 하겠습니다.

감사합니다.


Reference

Neo4j

http://www.neo4j.org/

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