SlideShare a Scribd company logo
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

PDF
Graph Database Meetup in Seoul #1. What is Graph Database? (그래프 데이터베이스 소개)
PDF
Graph Database Meetup in Korea #2. Graph Database Usecase (그래프 데이터베이스 활용사례)
PDF
Graph Database Meetup in Korea #4. 그래프 이론을 적용한 그래프 데이터베이스 활용 사례
PDF
インメモリーデータグリッドの選択肢
ODP
sshdのお話
PPTX
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
PDF
JPAのキャッシュを使ったアプリケーション高速化手法
PDF
単なるキャッシュじゃないよ!?infinispanの紹介
Graph Database Meetup in Seoul #1. What is Graph Database? (그래프 데이터베이스 소개)
Graph Database Meetup in Korea #2. Graph Database Usecase (그래프 데이터베이스 활용사례)
Graph Database Meetup in Korea #4. 그래프 이론을 적용한 그래프 데이터베이스 활용 사례
インメモリーデータグリッドの選択肢
sshdのお話
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
JPAのキャッシュを使ったアプリケーション高速化手法
単なるキャッシュじゃないよ!?infinispanの紹介

What's hot (20)

PPTX
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
PDF
A Brief Introduction to Knowledge Graphs
PDF
PDF
CCNAv5 - S2: Chapter 6 Static Routing
PPTX
Lustre, RoCE, and MAN
PDF
Mininet introduction
PDF
Spring Initializrをハックする-カスタマイズを通してその内部実装を覗く
PDF
End-to-end Streaming Between gRPC Services Via Kafka with John Fallows
PPTX
IPv6 ACL
PPTX
Base de données graphe et Neo4j
PDF
Open Policy Agent (OPA) 入門
PDF
Property graph vs. RDF Triplestore comparison in 2020
PDF
Share point における id管理と認証・認可
PDF
データベース02 - SQL概要
PDF
IIJmio meeting 25 スマートフォンはなぜ「つながらない」のか
PDF
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
PPTX
CCNP v6 Route: Implementing IP Routing Chapter 2
PPTX
ディープラーニングをAWS LambdaとStep Functionで自動化する
PDF
Fantiaから学ぶgcp運用のノウハウ
PPTX
The Art of the Possible with Graph - Sudhir Hasbe - GraphSummit London 14 Nov...
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
A Brief Introduction to Knowledge Graphs
CCNAv5 - S2: Chapter 6 Static Routing
Lustre, RoCE, and MAN
Mininet introduction
Spring Initializrをハックする-カスタマイズを通してその内部実装を覗く
End-to-end Streaming Between gRPC Services Via Kafka with John Fallows
IPv6 ACL
Base de données graphe et Neo4j
Open Policy Agent (OPA) 入門
Property graph vs. RDF Triplestore comparison in 2020
Share point における id管理と認証・認可
データベース02 - SQL概要
IIJmio meeting 25 スマートフォンはなぜ「つながらない」のか
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
CCNP v6 Route: Implementing IP Routing Chapter 2
ディープラーニングをAWS LambdaとStep Functionで自動化する
Fantiaから学ぶgcp運用のノウハウ
The Art of the Possible with Graph - Sudhir Hasbe - GraphSummit London 14 Nov...
Ad

Similar to 201804 neo4 j_cypher_guide (20)

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

More from Junyi Song (6)

PPTX
딥러닝프레임워크비교
PPTX
딥러닝(Deep Learing) using DeepDetect
PPTX
20151022 elasticsearch 적용및활용_송준이_sds발표용
PPTX
elasticsearch_적용 및 활용_정리
PDF
20140512 node.js를 활용한 실시간 웹채팅
PDF
사용자 스토리 기반의 스크럼
딥러닝프레임워크비교
딥러닝(Deep Learing) using DeepDetect
20151022 elasticsearch 적용및활용_송준이_sds발표용
elasticsearch_적용 및 활용_정리
20140512 node.js를 활용한 실시간 웹채팅
사용자 스토리 기반의 스크럼

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. 서비스 정의 • 제네릭 서비스 정의