Database/Graph Database

Cypher 기초(1/2)

Jonghee Jeon 2022. 8. 20. 14:47

Cypher 란?

 Cypher란 Neo4j 사에서 개발한 그래프 데이터베이스 질의 언어이며, SQL(Structured Query Language)에서 영감을 받아 개발되어 유사한 면이 있으며 쉽고 빠르게 배울 수 있어 그래프 데이터베이스에서 원하는 데이터를 손쉽게 검색할 수 있음

 

Cypher 질의 패턴

 Cypher는 특별하게 소괄호()대괄호[]를 이용하여 그래프 패턴과 관계에 대해 질의하는 방법을 제공함.  위의 그림 처럼 (nodes)-[:ARE_CONNECTED_TO]->(otherNodes)와 같은 패턴을 통해 그래프 데이터를 질의하며 소괄호는 노드대괄호는 관계를 의미하며 -->는 노드와 노드 사이의 관계 방향을 나타내며, Neo4j에 저장된 그래프 데이터에 대해 Create, Read, Update, or Delete (CRUD) 를 수행할 수 있음.

 

 Neo4j는 Cypher를 공개 프로젝트로 오픈하여 OpenCypher라는 그래프 질의언어 프로젝트를 통해 ISO에서 개발중인 표준 그래프 질의언어(GQL, Graph Query Language)의 기여하고 있음

openCyper 홈페이지

Cypher 기초

  아래와 같은 예제 그래프가 있다면 이를 어떻게 표현 할 수 있을까?

이 그래프는 간단히 아래 처럼 표현 될 수 있다.

Jennifer는 그래프를 좋아합니다. Jennifer는 Michael과 친구입니다. 제니퍼는 Neo4j에서 일합니다.

 

주석

 // 로 시작되며 뒤에 원하는 문구를 입력

 

■ Cypher 노드 표현

  Cypher는 패턴에 ASCII-Art*를 사용하기 때문에 그래프 각각의 구성 요소를 시각적으로 표현해야함. 주요 구성 요소는 노드와 관계이며 노드는 그래프의 데이터 엔티티이며, 데이터 모델에서 명사 또는 개체를 찾아 노드를 식별 할 수 있음. 여기서 Michael, Graph, Neo4j, Jennifer는 노드임.

* ASCII-Art : https://ko.wikipedia.org/wiki/%EC%95%84%EC%8A%A4%ED%82%A4_%EC%95%84%ED%8A%B8

  노드는 소괄호 () 를 이용하여 표현되며 소괄호 안에 노드를 명시함. ex) (Person), (Company), (Technology)

 

■ 노드 변수

  노드 표현을 위한 변수도 표현할 수 있으며 실제 구현에서는 노드의 명이 더 길 수 있기 때문에 이에 대한 변수를 지정할 수 있으며 빈 소괄호를 입력하여 익명의 노드를 지정할 수도 있음. ex) (p:Person), (c:Company), (t:Technology), ()

 

■ 노드 레이블

  그래프 모델에서 노드 레이블을 할당하여 유사한 노드를 그룹화 할 수 있음. 레이블은 일종의 태그이며 특정 유형의 엔터티를 지정할 수 있음. 위의 노드에서는 Person, Technolohy, Company가 레이블임. 

  레이블은 SQL에서 특정 행을 찾을 테이블을 지정하는 것과 비슷하며 Person 또는 Employee 테이블에서 사람의 정보를 질의하는 것과 유사하며 노드 레이블은 Cypher가 엔터티를 구별하고 쿼리 실행을 최적화하는 데 도움이 되며, 쿼리에 노드 레이블을 사용하는 것을 권장함

 * 노드 레이블을 지정하지 않을 경우 데이터베이스의  모든 노드를 검색함

Cypher
()                  //anonymous node (no label or variable) can refer to any node in the database
(p:Person)          //using variable p and label Person
(:Technology)       //no variable, label Technology
(work:Company)      //using variable work and label Company

 

■ Cypher 관계

  원하는 그래프 데이터를 더 잘 활용하기 위해 노드 표현 뿐만 아니라 관계에 대한 표현도 함께 이루어져야 함. 관계는 화살표 -> 또는 <- 로 표현됨. 

  아래의 예에서는 LIKES, IS_FRIENDS_WITH, WORKS_FOR 노드 사이의 라인이 관계임.

  방향이 없는 관계는 - 로만 표현되며 이것은 어떤 방향이로든 관계가 이루어짐을 의미하고 데이터베이스에는 방향성이 저장되어 있더라고 Cypher에서는 관계와 방향에 관계없이 일치하는 노드를 검색함.

  Cypher를 수행할 때 방향이 잘못 표현되면 원하는 결과를 얻지 못 할 수 있으며 이럴때는 무방향으로 검색하여 일부 결과를 찾는 것이 적절할 수 있음

//data stored with this direction
CREATE (p:Person)-[:LIKES]->(t:Technology)

//query relationship backwards will not return results
MATCH (p:Person)<-[:LIKES]-(t:Technology)

//better to query with undirected relationship unless sure of direction
MATCH (p:Person)-[:LIKES]-(t:Technology)

■ 관계 유형

  관계 유형은 노드에서 레이블을 통해 그룹화하는 것과 유사하게 관계를 분류 및 그룹화하고 의미를 추가함. 그래프 데이터 모델에서는 관계를 통해 노드가 서로 연결되고 관련되는 것을 보여줌. 일반적으로 특정 행동이나 동사를 적용하여 데이터 모델의 관계를 식별할 수 있음

  노드 간에 원하는 유형의 관계명을 지정할 수 있지만 행동이나 동사를 사용하여 좋은 명명 규칙을 사용하는 것을 권장함.

 

■ 관계 변수

  관계로 노드 변수를 지정하는 것과 동일하게 변수를 지정할 수 있음. ex) -[rel:LIKES]->

  * 관계 선언 시 관계 앞에 콜론이 빠지게 되면 모든 유형의 관계를 탐색할 수도 있음

 

 노드 및 관계 속성

  속성은 노드와 관계에 대한 추가적인 세부 정보를 제공하는 정보명-값 쌍이며, Cypher에서는 노드와 관계의 소괄호 안에 중괄호 {} 를 통해 적용할 수 있음

  • 노드 속성 : (p:Person {name: 'Jennifer'})
  • 관계 속성 : -[rel:IS_FRIENDS_WITH {since: 2018}]->

  속성은 다양한 데이터 유형의 값을 가질 수 있음

 

Property types

 - Integer, Float, String, Boolean, Point, Date, Time, LocalTime, DateTime, LocalDateTime, and Duration.

Structural types

 - Node, Relationship, and Path.

Composite types

 - List and Map.

 

■ Cypher 패턴

  노드와 관계는 그래프 패턴의 구조를 구성하며 이러한 구조를 함께 사용하여 단순하거나 복잡한 패턴으로 표현할 수 있음.  Cypher에서는 연속 경로로 작성하거나 더 작은 패턴으로 분리할 수도 있으며 아래와 같은 문구를

     Jennifer는 Graphs를 좋아한다.

Cypher로 표현하면 아래와 같음.

(p:Person {name: "Jennifer"})-[rel:LIKES]->(g:Technology {type: "Graphs"})

 


참고자료

https://neo4j.com/developer/cypher/intro-cypher/

 

Getting Started with Cypher - Developer Guides

This guide explains the basic concepts of Cypher, Neo4j's graph query language. You should be able to read and understand Cypher queries after finishing this guide.

neo4j.com