본문 바로가기
BackEnd/Database

[Neo4j] 그래프 Database Neo4j의 Cypher 언어

by 푸고배 2021. 5. 25.

 그래프 데이터베이스 

 

관계형 데이터베이스는 데이터 관계 처리에는 비효울적이다. 데이터의 관계를 모델링하려면 많이 복잡해지고 관계의 수와 JOIN이 커지면 성능이 떨어진다. 데이터의 인사이트를 찾기 위해서는 데이터간의 관계를 파악하면 좀 더 쉽게 접근이 가능하다. 이것을 도와주는 것이 그래픽 데이터베이스이다.

 

 장점 

  • 데이터간의 관계를 그래프 DB로 손쉽게 표현 가능
  • 노드와 노드를 관계로 정의하여 검색시 크로스 체크가 가능
  • 비지니스의 관계 변경시 실시간으로 데이터 관계를 변경 및 추가 노드가 쉽다.

 그래프 기본값 

관계형 데이터베이스는 자주 바뀌지 ㅇ낳는 데이터에 적합한 구조이다. 데이터 구조의 변형 및 관계를 추가 할 수 있지만 잦은 변경과 JOIN을 걸어 인사이트를 찾는 것은 무거운 작업이다.

 

그래프 데이터 베이스는 데이터간의 관계로 의미와 가치의 발견이 용이하다. 그래프 데이터베이스는 몇 가지 간단한 개념을 사용하여 모든 종류의 데이터를 저장할 수 있다.

  • 노드 : 그래프 데이터 레코드
  • 관계 : 노드의 연결
  • 속성 : 명명된 데이터의 값

 

 노드(Node) 

그래프는 노드로 구성된 두 개 이상의 엔티티가 서로 어떻게 연결되는지를 표현할 수 있다. 각각이 어떻게 관련이 있는지를 파악하고 빠르고 효율적으로 시각적인 방식으로 정보를 전달하는데 도움이 된다. 노드는 엔티티(Entity)이며 (키-값) 쌍으로 구성된 속성(Porpory)을 가진다. 그리고 역할(Role)에 따른 레이블(Lable)을 가진다.

 

Neo4J는 노드라고 불리는 레코드와 함께 그래프에 데이터를 저장한다. 가장 단순한 그래프는 속성이라고 불리는 값을 가진 단일 노드를 가지고 있다. 친구들에 대한 소셜 그래프를 그려보자

  • 원으로 노드를 그린다.
  • Emil이라는 이름을 추가한다.
  • Emil은 스웨덴 출신이다.
    • 노드는 그래프에서 데이터 레코드의 이름이다.
    • 데이터가 속성으로 저장된다.
    • 속성은 단순한 이름과 값의 쌍으로 구성된다.

 

 라벨 

노드의 집합을 연결하고 각 노드 멤버에 라벨을 적용하여 그룹화 할 수 있다. 소셜 그래프에서 한 사람을 나타내는 각 노드에 라벨을 붙여보자

  • Emil로 생성한 노드에 "Person" 레이블을 적용한다.
    • 노드는 0개 이상의 레이블이 있을 수 있다.
    • 레이블에는 속성이 없다.색상은 빨간색으로 표현하고 Person을 의미한다.

 

 추가 노드 

스키마가 없어도 노드는 공통 및 고유 특성의 혼합으로 가질 수 있다. 다른 데이터베이스와 마찬가지로 Neo4J에 데이터를 저장하는 것은 레코드를 추가하는 것만큼 간단하다.

  • Emil의 클라우드 점수는 99이다
  • Johan은 서핑을 배우고 있고 스웨덴 출신이다
  • Ian은 영국에서 왔으며 작가이다
  • Rik은 벨기에 출신이며 오르발이라는 고양이를 가지고 있다
  • Allison은 서핑을 하고 캘리포니아 출신이다
    • 유사한 노드지만 속성은 다를 수 있다.
    • 속성은 문자열, 숫자 또는 부울일 수 있다.
    • Neo4J는 수십억 개의 노드를 저장할 수 있다.

 

 관계(relationship)를 고려하자 

노드간의 관계는 관련 데이터를 쉽게 찾을 수 있어서 그래프 데이터베이스의 핵심기능이다. 관계는 두 개의 노드를 연결하며, 유효한 소스 노드와 대상노드를 갖도록 설계한다. 관계는 노드를 임의의 구조로 구성하여 그래프가 목록, 트리, 지도 또는 복합적인 요소들을 파악할 수 있도록 복잡한 구조를 상호연결 구조로 결합할 수 있다.

 

두 노드 사이 연결을 할 수 있으면, 이것은 방향성을 가지고 있다. 즉, 순방향과 역방향 순회 모두 가능하다. 관계는 Type을 가질 수 있으며 시작노드(start node)와 종료노드(end node)를 가지고 있다. 이때 'No broken links'가 있는데 이것의 의미는 시작 노드만 존재하거나 종료 노드만 존재하고 관계는 존재하지 않는다는 의미이다. 관계를 삭제하지 않은 채 노드를 삭제할 수는 없다. 관계도 (키-값) 쌍으로 구성된 속성을 가진다. 두 노드 사이에 여러 개의 관계를 가질 수 있다.

 

그래프 노드의 연결. Neo4J의 진짜 힘은 연결된 데이터에 있다. 두 노드를 연결하려면 레코드와 관련된 방법을 설명하는 관계를 추가해야 한다. 우리는 소셜 그래프에서 누가 무엇을 아는지 간단하게 확인하자

  • Emil KNOWS Johan and Ian
  • Johan KNOWS Ian and Rik
  • Rik and Ian KNOWS Allison
    • 관계는 항상 방향이 있다
    • 관계는 항상 유형이 있다
    • 관계는 데이터의 패턴을 형성한다.

 관계 속성 

노드와 관계는 모두 속성을 가질 수 있다. 속성은 이름(또는 키)이 문자열인 경우 명명된 값이다.

 

두 노드가 공유하는 정보를 저장한다. 속성 그래프에서 관계는 속성을 포함할 수 있다. Emil의 관계를 좀 더 자세히 살펴보면 다음과 같은 점에 유의해야 한다.

  • Emil 2001년부터 Johan과 알고 지내왔다.
  • Emil과 Ian의 클라우드 점수는 5점이다 (5점 만점)
  • 다른 모든 사람들은 유사한 관계 속성을 가질 수 있다.

 

 Cypher 란 

Cyper는 그래프 데이터의 표현적이고 효율적인 쿼리 및 업데이트를 허용하는 선언적인 쿼리 언어다. Cyper는 비교적 단순하고 매우 강력한 언어다. 복잡한 데이터베이스 쿼리는 Cyper를 통해 쉽게 표현할 수 있어 데이터베이스 액세스 구문에서 길을 잃지 않고 도메인에 집중할 수 있다.

 

사이퍼는 개발자와 다른 전문가 모두에게 적합한 인간 친화적인 질의 언어로 설계되었다. 안내하는 목표는 간단한 것, 그리고 복잡한 것을 가능하게 하는 것이다.

 

 Cypher is ASCII art 

인간이 읽을 수 있도록 최적화된 Cyper 구조는 질문을 좀 더 자기 설명적으로 만들기 위해 영어의 산문체와 같은 형태로(ASCII Art라고 함) 사용한다.

 

선언적인 언어인 Cyper는 그래프를 통해 무엇을 되찾아야 할지를 표현하는 명료성에 초점을 맞추고 있다. 당신은 Cyper를 그래프의 패턴에 영어 문장 구조를 매핑하는 것으로 생각할 수 있다. 예를 들어 명사는 그래프의 노드, 동사는 그래프의 관계, 형용사와 부사는 속성이다.

 

이것은 데이터베이스 접근을 위한 프로그램화된 필수 API와는 대조적이다. 이 접근법은 쿼리의 최적화는 개발자에게 부담이 되지만 구현 세부사항으로 만들어 물리적 데이터베이스 구조가 변경되었다는 이유만으로 모든 횡단면을 업데이트할 필요가 없게한다.

 

Cyper는 여러가지 다른 접근방법에 의해 영감을 받았고 표현적인 질의에 대한 확립된 관행에 기초한다. Where와 ORDER BY와 같은 많은 Cyper 키워드는 SQL에서 영감을 받았다. Cyper의 패턴 매칭 기능은 SPARQL에서 개념을 차용한다. 그리고 수집 의미론 중 일부는 Haskell과 Python과 같은 언어에서 차용되었다.

 

Cyper 언어는 누구나 오픈 Cyper(opencypher.org)를 통해 구현하고 사용할 수 있도록 만들어졌으며, 모든 데이터베이스 공급업체, 연구원 또는 다른 이해 당사자들이 그래프 질의 언어를 개발하면서 수년간의 노력과 경험의 혜택을 누릴 수 있게 했다.

 

 Nodes 

Cyper는 ( ), (n)과 같은 한 쌍의 괄호를 사용하여, 마치 화이트보드의 원처럼 노드를 나타낸다. 노드는 일반적으로 도메인의 엔티티를 나타낸다. 익명 노드( )는 노드의 유형이나 속성에 제한이 없는 쿼리 처리 중 하나 이상의 노드를 나타낸다. 노드에 대해 (n)을 지정할 때 이 쿼리의 경우 추가 쿼리 처리를 위해, 또는 쿼리에서 값을 반환하기 위해, 쿼리의 나중에 처리할 노드를 나타내기 위해, 변수 n을 사용쿼리를 수행한다.

 

Labels

그래프의 노드는 일반적으로 라벨이 붙어 있다. 라벨은 노드를 그룹화하고 그래프에 대해 쿼리를 필터링하는 데 사용된다. 즉, 쿼리를 최적화하기 위해 라벨을 사용할 수 있다. 작업할 동영상 데이터베이스에서 이 그래프의 노드는 두 가지 유형의 노드를 나타내기 위해 영화 또는 사람이라는 레이블이 지정된다.

예를 들어, Neo4j Browser에서 Database 아이콘을 클릭하기만 하면 데이터베이스의 레이블:

 

노드에 대한 레이블을 지정하여 쿼리할 노드 유형을 필터링할 수 있다. 노드는 0개 이상의 라벨을 가질 수 있다.

노드를 지정하기 위한 간단한 구문 예제:

 

()
(variable)
(:Label)
(variable:Label)
(:Label1:Label2)
(variable:Label1:Label2)

 

노드에 괄호가 있어야 한다는 점에 유의하고, 노드의 라벨과 변수는 선택사항이다.

Cypher에서 노드를 지정하는 예는 다음과 같다.

 

( )                         // anonymous node not be referenced later in the query
( p )                      // variable p, a reference to a node used later
( :Person )              // anonymous node of type Person
( p:Person )            // p, a reference to a node of type Person
( p:Actor:Director )    // p, a reference to a node of types Actor and Director

 

참고자료 : 

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

반응형

댓글