GQL은 왜 핫할까?

iseolin·2021년 6월 11일
3

graph

목록 보기
1/2
post-thumbnail

gql? 어디선가 많이 들어본 것 같은데...
GraphQL인가..?


😳 GQL이란 무엇일까?

Not to be Confused with GraphQL! -> GraphQL 과 혼동하지 마십시오.

GraphQL과 특히 헷갈리기 쉬운 GQL? 위키피디아(위키백과)에 가보면 이런 글이 있을 정도입니다.

사람들은 대부분 GQL을 GraphQL(API)와 같다고 생각합니다.
제 지인들도 GQL은 GraphQL의 줄임말이라고 생각하더라구요...

💫 SQL뒤로 혜성처럼 나타난...

GQL은 "Graph Query Language"로써 SQL을 이은 표준 쿼리 언어입니다. SQL 다음으로 2019 년 9월에 공식채택이 되었는데요!
만들어졌다면! 물론 그에 합당한 이유가 존재하겠죠??

🌠 GQL의 등장

관계형 데이터베이스는 지금까지 많은 사랑을 받고 있었습니다.

하지만!!
요새는 관계형 데이터베이스의 한계를 느끼고, NoSQL이 등장하며 이들이 많은 사랑을 받고 있고,
여기엔 GraphDataBase도 있습니다. [GraphDataBase란?]

엥 갑자기 그래프가 왜 나오는데? 🤔

😏 그래프의 엄청난 효과

그래프 모델을 사용하면 데이터간의 가장 가까운 경로 쿼리 또는 관계성 분석과 같은 데이터 엔티티간의 관계를 관찰해야하는 데이터 분석 기능을 효율적으로 실행할 수 있습니다.

그래프는 노드라고 불리는 데이터를 담고 있는 그릇과, 엣지(또는 간선)이라고 불리우는 노드를 잇는 선(노드와 노드 사이의 관계 정보를 가짐)이 있습니다. 탐색을 할 때 이 엣지라는 선을 타고 탐색을 하는 것이죠.

더 알고 싶다면?? -> 그래프 기본 용어

흐음...🤔 탐색을 할 때 엣지라는 선을 타고 탐색을 한다??
맞습니다. 그래프는 관계가 있는 엔티티들을 검색할 때,
즉 사용자에게 맞춤 서비스가 대두되는 이 시대에 엄청난 힘을 발휘할 수 있습니다. 💪

😡 그래프에 의한, 그래프를 위한!

현재 사용중인 그래프 모델에는 RDF 모델과 속성 그래프 모델이 있습니다.
RDF 모델은 W3C에 의해 표준화되었지만, 속성 그래프에 대한 일반적인 표준화 된 쿼리 언어(RDB의 SQL)가 없었습니다. GQL은 이 공백을 채우기 위해 제안되었습니다.

GQL은 속성 그래프를위한 쿼리 언어입니다.

현재 그래프 데이터베이스 및 프로젝트는 그래프 모델의 제한된 버전을 지원하고 있습니다.
그리고 표준 데이터 모델이 없는 상태입니다.
즉, 그래프 데이터베이스 및 프로젝트는 각각 지원하는 부분이 다 다릅니다.

예를 들어, Apache Tinkerpop는 각 노드와 각 엣지가 단일 레이블을 갖도록 강제합니다.
Cypher는 노드가 0개에서 여러 개의 레이블을 가질 수 있도록 허용하지만 관계에는 단일 레이블만 있습니다.
Neo4j의 데이터베이스는 문서화되지 않은 그래프 전체 속성을 지원하고,
Tinkerpop에는 동일한 역할을하는 그래프 값이 있으며, 메타 속성도 지원합니다.
Oracle의 PGQL은 노드와 엣지에서 0개 이상의 레이블을 지원하는 반면
SQL/PGQ는 각 요소 유형에 대해 1개 이상의 레이블을 지원합니다.

이런 사안과 다른 여러 사안들을 다루기 위해 GQL 프로젝트가 존재하는데요.
앞서 말한 그래프 데이터베이스 및 프로젝트의 표준 데이터 모델을 정의하는 것이 GQL 프로젝트의 할 일 중 하나입니다.
최소한 GQL의 첫 번째 버전은 공급 업체가 SQL/PGQ와 마찬가지로 각 구현에서 레이블의 카디널리티를 결정할 수 있도록 허용할 것이라고 하며, 또한 무방향 관계를 지원할지 여부를 선택할 것입니다.

🤤 GQL을 배워보자

GQL은 SQL과 매우 유사합니다.
SQL과 마찬가지로 대소문자를 구별하지 않습니다.
하지만 종류 및 속성 이름은 대소문자를 구별합니다.

GQL의 kind를 SQL의 테이블로,
GQL의 entity를 SQL의 행으로,
GQL의 property를 SQL의 열로 생각하면 쉽습니다.

중요! SQL의 행-열 조회는 단일 값으로 제한되지만 GQL에서는 속성이 다중 값 속성일 수 있습니다!

GQL은 SELECT 문만 지원을 하며, GQL 쿼리는 요청된 종류의 전체 항목, 프로젝션된 항목 또는 키를 0개 이상 반환합니다.

선택항목인 DISTINCT 절, FROM절, WHERE절이 있고,
각각 고유한 결과(속성 값이 동일한 항목의 첫번째 결과)만 반환,
지정된 종류의 항목을 반환,
하나 이상의 조건을 충족하는 항목만 반환합니다.

AND 키워드로 여러 조건을 지정할 수 있으며 모든 조건을 충족하는 항목만이 반환됩니다
OR 연산자는 없지만 OR을 제한된 형태로 제공하는 IN 연산자가 있습니다.

IN 연산자의 경우 속성 값을 목록의 각 항목과 비교합니다.
IN 연산자는 여러개의 = 쿼리가 or로 연결된 것과 같습니다.
또한 ANCESTOR IS 연산자를 사용하여 항목에 지정된 상위 항목이 있는지 여부도 테스트할 수 있습니다.

🔎 예시

전제조건

from google.appengine.ext import db
class Person(db.Model):
  name = db.StringProperty()
  age = db.IntegerProperty()
# We use a unique username for the Entity's key.
amy = Person(key_name='amym', name='Amy', age=48)
amy.put()
Person(key_name='bettyd', name='Betty', age=42).put()
Person(key_name='charliec', name='Charlie', age=32).put()
Person(key_name='charliek', name='Charlie', age=29).put()
Person(key_name='eedna', name='Edna', age=20).put()
Person(key_name='fredm', name='Fred', age=16, parent=amy).put()
Person(key_name='georgemichael', name='George').put()

(출처 : google gql reference)

where과 and 사용하기

SELECT name FROM Person WHERE age >= 20 AND age <= 30

나이가 20세 이상 30세 이하인 'Person' 종류의 name 항목을 검색합니다.

결과 -> Charlie과 Edna가 반환됩니다.

where과 In 사용하기

SELECT * FROM Person WHERE name IN ('Amy')

이름이 Amy인 'Person' 종류의 모든 항목을 검색합니다.
-> key_name='amym', name='Amy', age=48가 반환됩니다.

where과 Distinct 사용하기

SELECT DISTINCT name FROM Person

'Person' 종류의 고유한 name를 검색합니다.
-> Amy, Betty, Charlie, Edna, Fred, George가 반환됩니다.


생각보다 GQL에 대한 자료가 훨씬 없었습니다.
꽤나 최근에 생겼기도 하니...!😳
영어 잘 못 하는데 다 영어더라구요(한국어는 그냥 없다고 보는 게 맞습니다.)...
영어 공부를 좀 더 많이 해야겠어요. 😂

profile
"무엇이든지 지금 당장 귀찮게" 라는 모토로 개발하는 FE 개발자입니다.

1개의 댓글

comment-user-thumbnail
2022년 4월 3일

예시로 주신 google gql은 GraphQL이나 Graph Query Language가 아닌 또 다른 GQL인거 같네요ㅋㅋ
아마도 Google+SQL인거 같은데 확실치는 않아요
Graph Query Language는 Cypher라는 언어랑 비슷할꺼 같다하네요~

답글 달기