SlideShare a Scribd company logo
1 of 46
Neo4J Cypher 가이드
송준이
socurites@gmail.com
시작하기
그래프 DB?
• 그래프 DB
• 데이터 간의 관계를 일급 엔티티(first-class)로 다룰 수 있게 설계한 데이터베이스
• 저장 시점(store-time)에 데이터 간의 관계를 일급 엔티티로 저장
• 검색 시점(query-time)에 저장된 관계를 이용
• 데이터  관계  데이터 … 를 통한 순회(traverse) 가능
• 비교) 관계형 DB
• 검색 시점(query-time)에 데이터 관의 관계를 join 연산(값비싼)을 이용
• 데이터 = 노드(Node) ?
• 관계 = Relationship ?
속성 그래프 모델(Property Graph Model)
• 노드(Node)
• 엔티티(Entity)
• {키-값} 쌍으로 구성된 속성(Property)을 가진다
• 역할(role)에 따른 레이블(label)을 가진다
• 관계(Relationship)
• 두 노드 사이의 연결
• 방향성을 가진다
• But, 순방향 / 역방향 순회 모두 가능하다
• 타입(type)을 가진다
• 시작 노드(start node)와 종료 노드(end node)를 가진다
• “No broken links”
시작 노드만 존재하는 or 종료 노드만 존재하는 관계는 존재하지 않는다
관계를 삭제하지 않은 채 노드를 삭제할 수 없다
• {키-값}쌍으로 구성된 속성을 가진다
• 두 노드 사이에 여러 개의 관계를 가질 수 있다
Neo4J
• 오픈소스 NoSQL 그래프 DB
• ACID 트랜잭션 지원
• Native 그래프 DB
• 스토리지 레벨까지 구현됨
• Cypher 쿼리 언어 제공
• SQL-like
• 고정 시간(constant time) 순회 지원
• 속성(Property)과 레이블(Label)을 색인
• 유연한 스키마
• 유료 기능
• 클러스터링
• 런타임 장애복구
그래프 데이터 모델링
• 그래프 데이터 모델링
• 노드와 관계를 이용해서 연결 그래프(connected graph)로 기술하는 과정
• 예) 도메인: Sally & John
• 노드(Node)
• 개념적으로 유일한 대상(unique conceptual identity)
• 예) John, Sally, Graph Databases
• 노드는 관계(Relationship)를 가진다
• 노드는 속성(Properties)를 가진다.
• 노드는 레이블(Label)을 가진다
그래프 데이터 모델링
• 레이블(Label)
• 여러 노드를 하나의 집합(set)으로 묶기 위해서 사용하는 이름을 가지는 그래프 구조체(named graph construct)
• 동일한 레이블을 가지는 노드는 동일한 집합에 속한다
• 도메인 객체의 역할(role)을 식별함으로써, 레이블을 식별할 할 수 있다
• 예) Person
• John, Sally
Book
• Graph Databases
• 관계(Relationship)
• 노드 사이의 상호작용
• 예)
그래프 데이터 모델링
• 예) 그래프 데이터 모델(전체)
그래프 데이터 모델링
• {키:값} 속성(Property) 식별하기
• 이 모델이 무슨 질문을 할 것인가?
• 질문거리를 먼저 정의
• 예) About John & Sally
• John과 Sally는 친구가 된 게 언제인지?
• Graph Databases의 평균 평점은 얼마인지?
• Graph Databases의 저자는?
• Sally의 나이는?
• John의 나이는?
• Sally와 John 중에서 누가 나이가 많지?
• Sally와 John 중에서 누가 먼저 책을 읽었지?
• 질문에 답할 수 있는 속성을 정의
그래프 모델 생성과 질의
• 데이터와 관계를 생성하기 질의하기 전에…
• 로컬 테스트를 위한, Neo4J 데스크톱 버전 설치하기
• 다운로드 {AppImage 파일}
• 실행
• 로그인
그래프 모델 생성과 질의
• 데이터베이스 생성하기
• New Graph > Create a Local graph
• 접속하기
그래프 모델 생성과 질의
• Cypher 쿼리 언어로 로 노드 생성하기
• 예) Person인 Sally 생성하기
• 예) John과 Graph Databases 생성하기
• Cypher 쿼리 언어로 관계 생성하기
• 예) Sally is a FRIEND_OF John
• 예) Sally와 John은 HAS_READ Graph Databases
그래프 모델 생성과 질의
• 질의하기
• 예) About John & Sally
• John과 Sally는 친구가 된 게 언제인지?
• Graph Databases의 평균 평점은 얼마인지?
• Graph Databases의 저자는?
• Sally의 나이는?
• John의 나이는?
• Sally와 John 중에서 누가 나이가 많지?
• Sally와 John 중에서 누가 먼저 책을 읽었지?
Cypher 쿼리 언어
• SQL-like 선언형 쿼리 언어
• (노드)
• 레이블이 Person인 sally 노드: (sally:Person)
• 기본 문법
• Label에 소속된 node의 property를 리턴한다
• Label1에 소속된 node1과 Label2에 소속된 node2에 대해, 두 노드가 길이(Length)가 1인 관계가 있고(-->),
node1의 propertyA가 {value}인 경우,
node2의 propertyA와 propertyB를 리턴한다
Cypher 쿼리 언어
• -[관계]-
• (a)-->(b)
• (a)-[:KNOWS]->(b)
• (a)-[rel:KNOWS]->(b)
• (a)-[:KNOWS | :LIKE]->(b)
• (a)-[{since:2010}]->(b)
• (a)-[*]->(b)
• (a)-[*2]->(b)
• (a)-[*2..]->(b)
• (a)-[*2..5]->(b)
• (a)-[*..5]->(b)
• (a)-[:KNOWS*..4]->(b)
• 기본 문법
a b
KNOWS
(a)와 (b)가 길이 1의 관계가 있는
(a)와 (b)가 길이 1의 KNOWS 관계가 있는
(a)와 (b)가 길이 1의 KNOWS 관계가 있는, KNOWS 관계를 rel변수에 할당
(a)와 (b)가 길이 1의 KNOWS 또는 LIKE 관계가 있는
(a)와 (b)가 길이 1의 관계가 since 속성이 2010이라면
(a)와 (b)가 길이에 상관없이 관계가 있는
(a)와 (b)가 길이 2의 관계가 있는
(a)와 (b)가 길이 2 이상의 관계가 있는
(a)와 (b)가 길이 2 이상 5 이하의 관계가 있는
(a)와 (b)가 길이 5 이하의 관계가 있는
(a)와 (b)가 길이 4 이하의 KNOWS 관계가 있는
가변 길이 경로
Cypher 쿼리 언어
• 패턴(Pattern)
• (노드)와 [:관계]의 조합
• 찾으려는(MATCH) 또는 생성하려는(CREATE), (노드)와 [:관계]의 조합을 기술
• 예시)
Cypher 쿼리 언어
• 연습하기) Find an Expert
• 모든 데이터 삭제
• Person 추가
• (person)-[:LIKE]->(aThing)
• FRIENDs 추가 / 질의
• 연습하기) Find an Expert
• Expert 추가
• 내(You) 관계에서 가장 가까운 Neo4J 전문가를 찾기
Cypher 쿼리 언어
Northwind
LOAD CSV: CSV 데이터 로드
• ETL 도구인 LOAD CSV의 제공 기능
• CSV 데이터를 URI로부터 로드하고 처리
• 입력 데이터를 그래프/도메인 구조로 직접 매핑
• 데이터 변환 지원
• 복잡한 연산 지원
• 데이터/관계/구조 생성, 병합 지원
• CSV 파일을 로드하기 전에 데이터 품질을 검토한다
• 전체 건수를 확인
• 앞의 몇 행을 확인
• 헤더와 데이터를 함께 확인
CSV 데이터 로드
• 예제: Northwind 모델
CSV 데이터 로드
• 관계형 모델 vs. 그래프 모델
• 행(row) --- 노드(node)
• 테이블 이름 --- 레이블 이름
• 예제 데이터 다운로드: https://github.com/neo4j-contrib/developer-resources/tree/gh-pages/data/northwind
CSV 데이터 로드
• 노드부터 생성
Customer
Product
Supplier
Employee
Category
Order
|| same
CSV 데이터 로드
• 인덱스 생성
• 제약조건 생성
• UNIQUE 조건 생성시 인덱스 자동 생성
CSV 데이터 로드
• 관계 생성하기: -[PRODUCT]->
CSV 데이터 로드
• 관계 생성하기: -[SOLD]->
CSV 데이터 로드
• 관계 생성하기: -[PURCHASED]->
• 관계 생성하기: -[PART_OF]->
• 관계 생성하기: -[REPORTS_TO]->
CSV 데이터 로드
• 구성된 그래프
SQL vs. Cypher
• 상품을 조회
• 특정 필드를 조회 / 정렬 / 제한
• 단일 상품을 조회
• 인덱스 생성
• IN 연산자
• LIKE 연산자
SQL vs. Cypher
• JOIN
• “Chocolade” 제품을 구매한 구매자의 회사명 검색
• OUTER JOIN
• 특정 회사가 구매한 상품명 총금액
• 상품을 하나도 구매하지 않았더라도, 결과를 출력
• GROUP BY
[명시적] 집계할 필드를 명시적으로 모두 지정 [암묵적] 집계 함수를 사용하면, 나머지 필드(e.name)가 자동으로 GROUP 대상이 됨
SQL vs. Cypher
• 마스터-디테일 쿼리
• Employees와 Territories는 1-to-N의 관계
• Territory별 Employees를 조회하여 결과를 리턴하면,
• t.Description 정보가 Employee마다 중복되어 리턴됨
• Neo4J에서는,
• Cypyher의 collect() 함수를 이용,
• Employee를 list 형태로 모을 수 있음
SQL vs. Cypher
• 코드 테이블 JOIN
• 코드 테이블인 Categories에 parent-child 코드 계층성이 있다면,
• 특정 카테고리에 속하는 Product를 조회하려면,
• Neo4J에서는,
• 가변 길이 경로를 통해서 표현 가능
예제: 질의하기
• Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
• 해석하기
(:Product {productName:’Chocolade’})
Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
<-[:PRODUCT]-(:Order)<-[:SOLD]-
Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
(employee)
Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
-[:SOLD]->(o2)-[:PRODUCT]->(other:Product)
Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
ORDER BY count(distinct o2) DESC
Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
예제: 질의하기
• Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
예제: 질의하기
• 각 직원은 어떤 관리자에게 보고하는가?
• 해석하기
(employee:Employee)
각 직원은 어떤 관리자에게 보고하는가?
-[REPORTS_TO]->
각 직원은 어떤 관리자에게 보고하는가?
(manager:Employee)
각 직원은 어떤 관리자에게 보고하는가?
예제: 질의하기
• 각 직원은 서로 직접적인 관계에 있나, 아니면 간접적인 관계이 있나?
• 번역하기
• 추가설명) Collection 구문
• 0과 10 사이의 정수에 대해, 짝수이면, 정수의 제곱을 가지는 Collection을 생성
• 이때 0th 요소와 마지막 요소는 제외
각 직원 사이의 관계는 거리가 0인가, 아니면 1 이상인가?
(e:Employee) <-[:REPORTS_TO*]-(sub:Employee) as path
각 직원 사이의 관계는 거리가 0인가, 아니면 1 이상인가?
LENGTH( [ NODES(path) ][1..-1] ) Collection 구문
e e
:REPRTS_TO
e
:REPRTS_TO
e
*2..
거리: 0
거리 = 시작/종료 노드는 제외한 경로 상의 모든 노드의 개수
LENGTH( [ NODES(path) ][1..-1] )
예제: 질의하기
• 각 직원은 서로 직접적인 관계에 있나, 아니면 간접적인 관계이 있나?
예제: 변경하기
• Janet(3)은 이제 Steven(5)에게만 보고해야 한다
OGM/JAVA 예제
- NorthWind -
https://github.com/socurites/neo4j-northwind-java
OGM
• 객체-그래프-매핑(Object Graph Mapping)
• 객체-관계-매핑(ORM, Object Relation Mapping)과 유사
• 주요 패턴 및 재사용 모듈을 통해 구현이 용이
• findAll()
• find()
• delete()
• ….
• 동적 @Properties 제공
• 엔티티 객체 정의할 때, 개별 Property를 일일이 명시하지 않고 Map 형태로 작성할 수 있음
Configure Spring-boot & OGM
• build.gradle
• NorthWindConfig.java
• Session 객체 생성
객체 모델링
• Product와 Order
객체 모델링
• 노드 엔티티로 변환
<-[PRODUCT]-
서비스 정의
• 제네릭 서비스 정의
서비스 정의
• Product Service 정의
서비스 정의
• 커스텀 Cypher 사용

More Related Content

What's hot

Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기AWSKRUG - AWS한국사용자모임
 
MySQL GTID 시작하기
MySQL GTID 시작하기MySQL GTID 시작하기
MySQL GTID 시작하기I Goo Lee
 
Apache Arrow Flight: A New Gold Standard for Data Transport
Apache Arrow Flight: A New Gold Standard for Data TransportApache Arrow Flight: A New Gold Standard for Data Transport
Apache Arrow Flight: A New Gold Standard for Data TransportWes McKinney
 
FIWARE Wednesday Webinars - Introduction to NGSI-LD
FIWARE Wednesday Webinars - Introduction to NGSI-LDFIWARE Wednesday Webinars - Introduction to NGSI-LD
FIWARE Wednesday Webinars - Introduction to NGSI-LDFIWARE
 
Using ClickHouse for Experimentation
Using ClickHouse for ExperimentationUsing ClickHouse for Experimentation
Using ClickHouse for ExperimentationGleb Kanterov
 
Cassandra Introduction & Features
Cassandra Introduction & FeaturesCassandra Introduction & Features
Cassandra Introduction & FeaturesDataStax Academy
 
Hive+Tez: A performance deep dive
Hive+Tez: A performance deep diveHive+Tez: A performance deep dive
Hive+Tez: A performance deep divet3rmin4t0r
 
Neo4j Fundamentals
Neo4j FundamentalsNeo4j Fundamentals
Neo4j FundamentalsMax De Marzi
 
Unlocking the Power of Lakehouse Architectures with Apache Pulsar and Apache ...
Unlocking the Power of Lakehouse Architectures with Apache Pulsar and Apache ...Unlocking the Power of Lakehouse Architectures with Apache Pulsar and Apache ...
Unlocking the Power of Lakehouse Architectures with Apache Pulsar and Apache ...StreamNative
 
PostgreSQL HA
PostgreSQL   HAPostgreSQL   HA
PostgreSQL HAharoonm
 
Achieving High Availability in PostgreSQL
Achieving High Availability in PostgreSQLAchieving High Availability in PostgreSQL
Achieving High Availability in PostgreSQLMydbops
 
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...Altinity Ltd
 
Azure databases for PostgreSQL, MySQL and MariaDB
Azure databases for PostgreSQL, MySQL and MariaDB Azure databases for PostgreSQL, MySQL and MariaDB
Azure databases for PostgreSQL, MySQL and MariaDB rockplace
 
What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...
What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...
What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...HostedbyConfluent
 
Building an open data platform with apache iceberg
Building an open data platform with apache icebergBuilding an open data platform with apache iceberg
Building an open data platform with apache icebergAlluxio, Inc.
 
[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기NHN FORWARD
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리Junyi Song
 
이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.Kris Jeong
 

What's hot (20)

Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
MySQL GTID 시작하기
MySQL GTID 시작하기MySQL GTID 시작하기
MySQL GTID 시작하기
 
Apache Arrow Flight: A New Gold Standard for Data Transport
Apache Arrow Flight: A New Gold Standard for Data TransportApache Arrow Flight: A New Gold Standard for Data Transport
Apache Arrow Flight: A New Gold Standard for Data Transport
 
Druid
DruidDruid
Druid
 
FIWARE Wednesday Webinars - Introduction to NGSI-LD
FIWARE Wednesday Webinars - Introduction to NGSI-LDFIWARE Wednesday Webinars - Introduction to NGSI-LD
FIWARE Wednesday Webinars - Introduction to NGSI-LD
 
Using ClickHouse for Experimentation
Using ClickHouse for ExperimentationUsing ClickHouse for Experimentation
Using ClickHouse for Experimentation
 
Cassandra Introduction & Features
Cassandra Introduction & FeaturesCassandra Introduction & Features
Cassandra Introduction & Features
 
Hive+Tez: A performance deep dive
Hive+Tez: A performance deep diveHive+Tez: A performance deep dive
Hive+Tez: A performance deep dive
 
Neo4j Fundamentals
Neo4j FundamentalsNeo4j Fundamentals
Neo4j Fundamentals
 
Unlocking the Power of Lakehouse Architectures with Apache Pulsar and Apache ...
Unlocking the Power of Lakehouse Architectures with Apache Pulsar and Apache ...Unlocking the Power of Lakehouse Architectures with Apache Pulsar and Apache ...
Unlocking the Power of Lakehouse Architectures with Apache Pulsar and Apache ...
 
PostgreSQL HA
PostgreSQL   HAPostgreSQL   HA
PostgreSQL HA
 
Achieving High Availability in PostgreSQL
Achieving High Availability in PostgreSQLAchieving High Availability in PostgreSQL
Achieving High Availability in PostgreSQL
 
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
 
MyRocks Deep Dive
MyRocks Deep DiveMyRocks Deep Dive
MyRocks Deep Dive
 
Azure databases for PostgreSQL, MySQL and MariaDB
Azure databases for PostgreSQL, MySQL and MariaDB Azure databases for PostgreSQL, MySQL and MariaDB
Azure databases for PostgreSQL, MySQL and MariaDB
 
What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...
What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...
What is the State of my Kafka Streams Application? Unleashing Metrics. | Neil...
 
Building an open data platform with apache iceberg
Building an open data platform with apache icebergBuilding an open data platform with apache iceberg
Building an open data platform with apache iceberg
 
[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.
 

Similar to 201804 neo4 j_cypher_guide

Introduction to mongo db
Introduction to mongo dbIntroduction to mongo db
Introduction to mongo dbMinho Kim
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Younghan Kim
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Jin wook
 
정보검색과 Elasticsearch (크몽)
정보검색과 Elasticsearch (크몽)정보검색과 Elasticsearch (크몽)
정보검색과 Elasticsearch (크몽)크몽
 
Machine Learning Foundations (a case study approach) 강의 정리
Machine Learning Foundations (a case study approach) 강의 정리Machine Learning Foundations (a case study approach) 강의 정리
Machine Learning Foundations (a case study approach) 강의 정리SANG WON PARK
 
AWS CLOUD 2018- Amazon Neptune, 신규 그래프 데이터베이스 서비스 (김상필 솔루션즈 아키텍트)
AWS CLOUD 2018- Amazon Neptune, 신규 그래프 데이터베이스 서비스 (김상필 솔루션즈 아키텍트)AWS CLOUD 2018- Amazon Neptune, 신규 그래프 데이터베이스 서비스 (김상필 솔루션즈 아키텍트)
AWS CLOUD 2018- Amazon Neptune, 신규 그래프 데이터베이스 서비스 (김상필 솔루션즈 아키텍트)Amazon Web Services Korea
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XpressEngine
 
Geo tools Data Transfer
Geo tools Data TransferGeo tools Data Transfer
Geo tools Data TransferJiyoon Kim
 
Lab Seminar - Reading Wikipedia to Answer Open-Domain Questions (DrQA)
Lab Seminar - Reading Wikipedia to Answer Open-Domain Questions (DrQA)Lab Seminar - Reading Wikipedia to Answer Open-Domain Questions (DrQA)
Lab Seminar - Reading Wikipedia to Answer Open-Domain Questions (DrQA)hkh
 
Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문SeungHyun Eom
 
엔지니어 관점에서 바라본 데이터시각화
엔지니어 관점에서 바라본 데이터시각화엔지니어 관점에서 바라본 데이터시각화
엔지니어 관점에서 바라본 데이터시각화Kenneth Ceyer
 
Mongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUDMongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUDJin wook
 
Zeppelin notebook 만들기
Zeppelin notebook 만들기Zeppelin notebook 만들기
Zeppelin notebook 만들기Soo-Kyung Choi
 
데이터분석과저널리즘 정제에서 분석까지
데이터분석과저널리즘 정제에서 분석까지데이터분석과저널리즘 정제에서 분석까지
데이터분석과저널리즘 정제에서 분석까지Gee Yeon Hyun
 
Power BI Briefing 2018년 10월
Power BI Briefing 2018년 10월Power BI Briefing 2018년 10월
Power BI Briefing 2018년 10월Hongju Jung
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료ssuser776e2d
 
Tadpole db hub-monitoring
Tadpole db hub-monitoring Tadpole db hub-monitoring
Tadpole db hub-monitoring cho hyun jong
 
Unify data and model using Apache S2Graph and GraphQL.
Unify data and model using Apache S2Graph and GraphQL.Unify data and model using Apache S2Graph and GraphQL.
Unify data and model using Apache S2Graph and GraphQL.if kakao
 

Similar to 201804 neo4 j_cypher_guide (20)

Introduction to mongo db
Introduction to mongo dbIntroduction to mongo db
Introduction to mongo db
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략
 
정보검색과 Elasticsearch (크몽)
정보검색과 Elasticsearch (크몽)정보검색과 Elasticsearch (크몽)
정보검색과 Elasticsearch (크몽)
 
Machine Learning Foundations (a case study approach) 강의 정리
Machine Learning Foundations (a case study approach) 강의 정리Machine Learning Foundations (a case study approach) 강의 정리
Machine Learning Foundations (a case study approach) 강의 정리
 
AWS CLOUD 2018- Amazon Neptune, 신규 그래프 데이터베이스 서비스 (김상필 솔루션즈 아키텍트)
AWS CLOUD 2018- Amazon Neptune, 신규 그래프 데이터베이스 서비스 (김상필 솔루션즈 아키텍트)AWS CLOUD 2018- Amazon Neptune, 신규 그래프 데이터베이스 서비스 (김상필 솔루션즈 아키텍트)
AWS CLOUD 2018- Amazon Neptune, 신규 그래프 데이터베이스 서비스 (김상필 솔루션즈 아키텍트)
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
 
Geo tools Data Transfer
Geo tools Data TransferGeo tools Data Transfer
Geo tools Data Transfer
 
Lab Seminar - Reading Wikipedia to Answer Open-Domain Questions (DrQA)
Lab Seminar - Reading Wikipedia to Answer Open-Domain Questions (DrQA)Lab Seminar - Reading Wikipedia to Answer Open-Domain Questions (DrQA)
Lab Seminar - Reading Wikipedia to Answer Open-Domain Questions (DrQA)
 
Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문
 
엔지니어 관점에서 바라본 데이터시각화
엔지니어 관점에서 바라본 데이터시각화엔지니어 관점에서 바라본 데이터시각화
엔지니어 관점에서 바라본 데이터시각화
 
Mongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUDMongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUD
 
Database
DatabaseDatabase
Database
 
Zeppelin notebook 만들기
Zeppelin notebook 만들기Zeppelin notebook 만들기
Zeppelin notebook 만들기
 
데이터분석과저널리즘 정제에서 분석까지
데이터분석과저널리즘 정제에서 분석까지데이터분석과저널리즘 정제에서 분석까지
데이터분석과저널리즘 정제에서 분석까지
 
Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
 
Power BI Briefing 2018년 10월
Power BI Briefing 2018년 10월Power BI Briefing 2018년 10월
Power BI Briefing 2018년 10월
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
Tadpole db hub-monitoring
Tadpole db hub-monitoring Tadpole db hub-monitoring
Tadpole db hub-monitoring
 
Unify data and model using Apache S2Graph and GraphQL.
Unify data and model using Apache S2Graph and GraphQL.Unify data and model using Apache S2Graph and GraphQL.
Unify data and model using Apache S2Graph and GraphQL.
 

201804 neo4 j_cypher_guide

  • 3. 그래프 DB? • 그래프 DB • 데이터 간의 관계를 일급 엔티티(first-class)로 다룰 수 있게 설계한 데이터베이스 • 저장 시점(store-time)에 데이터 간의 관계를 일급 엔티티로 저장 • 검색 시점(query-time)에 저장된 관계를 이용 • 데이터  관계  데이터 … 를 통한 순회(traverse) 가능 • 비교) 관계형 DB • 검색 시점(query-time)에 데이터 관의 관계를 join 연산(값비싼)을 이용 • 데이터 = 노드(Node) ? • 관계 = Relationship ?
  • 4. 속성 그래프 모델(Property Graph Model) • 노드(Node) • 엔티티(Entity) • {키-값} 쌍으로 구성된 속성(Property)을 가진다 • 역할(role)에 따른 레이블(label)을 가진다 • 관계(Relationship) • 두 노드 사이의 연결 • 방향성을 가진다 • But, 순방향 / 역방향 순회 모두 가능하다 • 타입(type)을 가진다 • 시작 노드(start node)와 종료 노드(end node)를 가진다 • “No broken links” 시작 노드만 존재하는 or 종료 노드만 존재하는 관계는 존재하지 않는다 관계를 삭제하지 않은 채 노드를 삭제할 수 없다 • {키-값}쌍으로 구성된 속성을 가진다 • 두 노드 사이에 여러 개의 관계를 가질 수 있다
  • 5. Neo4J • 오픈소스 NoSQL 그래프 DB • ACID 트랜잭션 지원 • Native 그래프 DB • 스토리지 레벨까지 구현됨 • Cypher 쿼리 언어 제공 • SQL-like • 고정 시간(constant time) 순회 지원 • 속성(Property)과 레이블(Label)을 색인 • 유연한 스키마 • 유료 기능 • 클러스터링 • 런타임 장애복구
  • 6. 그래프 데이터 모델링 • 그래프 데이터 모델링 • 노드와 관계를 이용해서 연결 그래프(connected graph)로 기술하는 과정 • 예) 도메인: Sally & John • 노드(Node) • 개념적으로 유일한 대상(unique conceptual identity) • 예) John, Sally, Graph Databases • 노드는 관계(Relationship)를 가진다 • 노드는 속성(Properties)를 가진다. • 노드는 레이블(Label)을 가진다
  • 7. 그래프 데이터 모델링 • 레이블(Label) • 여러 노드를 하나의 집합(set)으로 묶기 위해서 사용하는 이름을 가지는 그래프 구조체(named graph construct) • 동일한 레이블을 가지는 노드는 동일한 집합에 속한다 • 도메인 객체의 역할(role)을 식별함으로써, 레이블을 식별할 할 수 있다 • 예) Person • John, Sally Book • Graph Databases • 관계(Relationship) • 노드 사이의 상호작용 • 예)
  • 8. 그래프 데이터 모델링 • 예) 그래프 데이터 모델(전체)
  • 9. 그래프 데이터 모델링 • {키:값} 속성(Property) 식별하기 • 이 모델이 무슨 질문을 할 것인가? • 질문거리를 먼저 정의 • 예) About John & Sally • John과 Sally는 친구가 된 게 언제인지? • Graph Databases의 평균 평점은 얼마인지? • Graph Databases의 저자는? • Sally의 나이는? • John의 나이는? • Sally와 John 중에서 누가 나이가 많지? • Sally와 John 중에서 누가 먼저 책을 읽었지? • 질문에 답할 수 있는 속성을 정의
  • 10. 그래프 모델 생성과 질의 • 데이터와 관계를 생성하기 질의하기 전에… • 로컬 테스트를 위한, Neo4J 데스크톱 버전 설치하기 • 다운로드 {AppImage 파일} • 실행 • 로그인
  • 11. 그래프 모델 생성과 질의 • 데이터베이스 생성하기 • New Graph > Create a Local graph • 접속하기
  • 12. 그래프 모델 생성과 질의 • Cypher 쿼리 언어로 로 노드 생성하기 • 예) Person인 Sally 생성하기 • 예) John과 Graph Databases 생성하기 • Cypher 쿼리 언어로 관계 생성하기 • 예) Sally is a FRIEND_OF John • 예) Sally와 John은 HAS_READ Graph Databases
  • 13. 그래프 모델 생성과 질의 • 질의하기 • 예) About John & Sally • John과 Sally는 친구가 된 게 언제인지? • Graph Databases의 평균 평점은 얼마인지? • Graph Databases의 저자는? • Sally의 나이는? • John의 나이는? • Sally와 John 중에서 누가 나이가 많지? • Sally와 John 중에서 누가 먼저 책을 읽었지?
  • 14. Cypher 쿼리 언어 • SQL-like 선언형 쿼리 언어 • (노드) • 레이블이 Person인 sally 노드: (sally:Person) • 기본 문법 • Label에 소속된 node의 property를 리턴한다 • Label1에 소속된 node1과 Label2에 소속된 node2에 대해, 두 노드가 길이(Length)가 1인 관계가 있고(-->), node1의 propertyA가 {value}인 경우, node2의 propertyA와 propertyB를 리턴한다
  • 15. Cypher 쿼리 언어 • -[관계]- • (a)-->(b) • (a)-[:KNOWS]->(b) • (a)-[rel:KNOWS]->(b) • (a)-[:KNOWS | :LIKE]->(b) • (a)-[{since:2010}]->(b) • (a)-[*]->(b) • (a)-[*2]->(b) • (a)-[*2..]->(b) • (a)-[*2..5]->(b) • (a)-[*..5]->(b) • (a)-[:KNOWS*..4]->(b) • 기본 문법 a b KNOWS (a)와 (b)가 길이 1의 관계가 있는 (a)와 (b)가 길이 1의 KNOWS 관계가 있는 (a)와 (b)가 길이 1의 KNOWS 관계가 있는, KNOWS 관계를 rel변수에 할당 (a)와 (b)가 길이 1의 KNOWS 또는 LIKE 관계가 있는 (a)와 (b)가 길이 1의 관계가 since 속성이 2010이라면 (a)와 (b)가 길이에 상관없이 관계가 있는 (a)와 (b)가 길이 2의 관계가 있는 (a)와 (b)가 길이 2 이상의 관계가 있는 (a)와 (b)가 길이 2 이상 5 이하의 관계가 있는 (a)와 (b)가 길이 5 이하의 관계가 있는 (a)와 (b)가 길이 4 이하의 KNOWS 관계가 있는 가변 길이 경로
  • 16. Cypher 쿼리 언어 • 패턴(Pattern) • (노드)와 [:관계]의 조합 • 찾으려는(MATCH) 또는 생성하려는(CREATE), (노드)와 [:관계]의 조합을 기술 • 예시)
  • 17. Cypher 쿼리 언어 • 연습하기) Find an Expert • 모든 데이터 삭제 • Person 추가 • (person)-[:LIKE]->(aThing) • FRIENDs 추가 / 질의
  • 18. • 연습하기) Find an Expert • Expert 추가 • 내(You) 관계에서 가장 가까운 Neo4J 전문가를 찾기 Cypher 쿼리 언어
  • 20. LOAD CSV: CSV 데이터 로드 • ETL 도구인 LOAD CSV의 제공 기능 • CSV 데이터를 URI로부터 로드하고 처리 • 입력 데이터를 그래프/도메인 구조로 직접 매핑 • 데이터 변환 지원 • 복잡한 연산 지원 • 데이터/관계/구조 생성, 병합 지원 • CSV 파일을 로드하기 전에 데이터 품질을 검토한다 • 전체 건수를 확인 • 앞의 몇 행을 확인 • 헤더와 데이터를 함께 확인
  • 21. CSV 데이터 로드 • 예제: Northwind 모델
  • 22. CSV 데이터 로드 • 관계형 모델 vs. 그래프 모델 • 행(row) --- 노드(node) • 테이블 이름 --- 레이블 이름 • 예제 데이터 다운로드: https://github.com/neo4j-contrib/developer-resources/tree/gh-pages/data/northwind
  • 23. CSV 데이터 로드 • 노드부터 생성 Customer Product Supplier Employee Category Order || same
  • 24. CSV 데이터 로드 • 인덱스 생성 • 제약조건 생성 • UNIQUE 조건 생성시 인덱스 자동 생성
  • 25. CSV 데이터 로드 • 관계 생성하기: -[PRODUCT]->
  • 26. CSV 데이터 로드 • 관계 생성하기: -[SOLD]->
  • 27. CSV 데이터 로드 • 관계 생성하기: -[PURCHASED]-> • 관계 생성하기: -[PART_OF]-> • 관계 생성하기: -[REPORTS_TO]->
  • 28. CSV 데이터 로드 • 구성된 그래프
  • 29. SQL vs. Cypher • 상품을 조회 • 특정 필드를 조회 / 정렬 / 제한 • 단일 상품을 조회 • 인덱스 생성 • IN 연산자 • LIKE 연산자
  • 30. SQL vs. Cypher • JOIN • “Chocolade” 제품을 구매한 구매자의 회사명 검색 • OUTER JOIN • 특정 회사가 구매한 상품명 총금액 • 상품을 하나도 구매하지 않았더라도, 결과를 출력 • GROUP BY [명시적] 집계할 필드를 명시적으로 모두 지정 [암묵적] 집계 함수를 사용하면, 나머지 필드(e.name)가 자동으로 GROUP 대상이 됨
  • 31. SQL vs. Cypher • 마스터-디테일 쿼리 • Employees와 Territories는 1-to-N의 관계 • Territory별 Employees를 조회하여 결과를 리턴하면, • t.Description 정보가 Employee마다 중복되어 리턴됨 • Neo4J에서는, • Cypyher의 collect() 함수를 이용, • Employee를 list 형태로 모을 수 있음
  • 32. SQL vs. Cypher • 코드 테이블 JOIN • 코드 테이블인 Categories에 parent-child 코드 계층성이 있다면, • 특정 카테고리에 속하는 Product를 조회하려면, • Neo4J에서는, • 가변 길이 경로를 통해서 표현 가능
  • 33. 예제: 질의하기 • Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가? • 해석하기 (:Product {productName:’Chocolade’}) Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가? <-[:PRODUCT]-(:Order)<-[:SOLD]- Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가? (employee) Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가? -[:SOLD]->(o2)-[:PRODUCT]->(other:Product) Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가? ORDER BY count(distinct o2) DESC Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
  • 34. 예제: 질의하기 • Chocolade 제품을 판매한 직원이 판매한 다른 제품은 무엇이며, 가장 다양한 제품을 판매한 직원은 누구인가?
  • 35. 예제: 질의하기 • 각 직원은 어떤 관리자에게 보고하는가? • 해석하기 (employee:Employee) 각 직원은 어떤 관리자에게 보고하는가? -[REPORTS_TO]-> 각 직원은 어떤 관리자에게 보고하는가? (manager:Employee) 각 직원은 어떤 관리자에게 보고하는가?
  • 36. 예제: 질의하기 • 각 직원은 서로 직접적인 관계에 있나, 아니면 간접적인 관계이 있나? • 번역하기 • 추가설명) Collection 구문 • 0과 10 사이의 정수에 대해, 짝수이면, 정수의 제곱을 가지는 Collection을 생성 • 이때 0th 요소와 마지막 요소는 제외 각 직원 사이의 관계는 거리가 0인가, 아니면 1 이상인가? (e:Employee) <-[:REPORTS_TO*]-(sub:Employee) as path 각 직원 사이의 관계는 거리가 0인가, 아니면 1 이상인가? LENGTH( [ NODES(path) ][1..-1] ) Collection 구문 e e :REPRTS_TO e :REPRTS_TO e *2.. 거리: 0 거리 = 시작/종료 노드는 제외한 경로 상의 모든 노드의 개수 LENGTH( [ NODES(path) ][1..-1] )
  • 37. 예제: 질의하기 • 각 직원은 서로 직접적인 관계에 있나, 아니면 간접적인 관계이 있나?
  • 38. 예제: 변경하기 • Janet(3)은 이제 Steven(5)에게만 보고해야 한다
  • 39. OGM/JAVA 예제 - NorthWind - https://github.com/socurites/neo4j-northwind-java
  • 40. OGM • 객체-그래프-매핑(Object Graph Mapping) • 객체-관계-매핑(ORM, Object Relation Mapping)과 유사 • 주요 패턴 및 재사용 모듈을 통해 구현이 용이 • findAll() • find() • delete() • …. • 동적 @Properties 제공 • 엔티티 객체 정의할 때, 개별 Property를 일일이 명시하지 않고 Map 형태로 작성할 수 있음
  • 41. Configure Spring-boot & OGM • build.gradle • NorthWindConfig.java • Session 객체 생성
  • 43. 객체 모델링 • 노드 엔티티로 변환 <-[PRODUCT]-
  • 44. 서비스 정의 • 제네릭 서비스 정의