Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Graph Databases, a little connected tour (Codem...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Francisco Fernández Castaño
April 11, 2014
Programming
140
0
Share
Graph Databases, a little connected tour (Codemotion Rome)
Slides of my talk at Codemotion Rome 2014
http://rome.codemotionworld.com/2014/
Francisco Fernández Castaño
April 11, 2014
More Decks by Francisco Fernández Castaño
See All by Francisco Fernández Castaño
Bases de datos de grafos, un recorrido conectado
fcofdez
0
91
Graph Databases
fcofdez
1
240
Graph Databases
fcofdez
3
310
Metaprogramming Ruby
fcofdez
1
96
Other Decks in Programming
See All in Programming
forteeの改修から振り返るPHPerKaigi 2026
muno92
PRO
3
270
ルールルルルルRubyの中身の予備知識 ── RubyKaigiの前に予習しなイカ?
ydah
1
150
Codex CLI でつくる、Issue から merge までの開発フロー
amata1219
0
350
PHP で mp3 プレイヤーを実装しよう
m3m0r7
PRO
0
260
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
6.3k
YJITとZJITにはイカなる違いがあるのか?
nakiym
0
200
RSAが破られる前に知っておきたい 耐量子計算機暗号(PQC)入門 / Intro to PQC: Preparing for the Post-RSA Era
mackey0225
3
130
Vibe하게 만드는 Flutter GenUI App With ADK , 박제창, BWAI Incheon 2026
itsmedreamwalker
0
550
10 Tips of AWS ~Gen AI on AWS~
licux
5
330
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
500
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
130
瑠璃の宝石に学ぶ技術の声の聴き方 / 【劇場版】アニメから得た学びを発表会2026 #エンジニアニメ
mazrean
0
240
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.6k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
99
Information Architects: The Missing Link in Design Systems
soysaucechin
0
880
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1k
Navigating Team Friction
lara
192
16k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
310
Claude Code のすすめ
schroneko
67
220k
Embracing the Ebb and Flow
colly
88
5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Designing Experiences People Love
moore
143
24k
Transcript
Graph Databases A little connected tour ! @fcofdezc
Francisco Fernández Castaño @fcofdezc Sw Engineer @biicode
Beginning
None
The old town of Königsberg has seven bridges: Can you
take a walk through town, visiting each part of the town and crossing each bridge only once?
El origen G = (V, E)
None
What is a Graph DB?
Graph Nodes Relationships Properties Store Store Connect Have Have
Written in Java ACID Rest interface Cypher
Why NOSQL?
The value of Relational Databases
Ventajas de BD Relacionales Concurrencia Persistencia Integración Estándar Persistence
Ventajas de BD Relacionales Concurrencia Persistencia Integración Estándar Concurrency
Ventajas de BD Relacionales Concurrencia Persistencia Integración Estándar Integration
Ventajas de BD Relacionales Concurrencia Persistencia Integración Estándar Standard
inconveniences Relational DBs
El Origen Impedance Mismatch
class Client < ActiveRecord::Base has_one :address has_many :orders has_and_belongs_to_many :roles
end
DesVentajas de BD Relacionales Fricción! Interoperabilidad Adaptación al cambio Escalabilidad
No está destinada para ciertos escenarios Interoperability
Adaptation to changes
!Scalability
The traditional way in the context of connected data is
artificial
Depth MySQL time (s) Neo4j time (s) Results 2 0.016
0.01 ~2500 3 30.267 0.168 ~110,000 4 1543.505 1.359 ~600,000 5 No Acaba 2.132 ~800,000 MySQL vs Neo4j * Neo4J in Action
Person Id Person 1 Frank 2 John .. … 99
Alice PersonFriend PersonID FriendID 1 2 2 1 .. … 99 2
O(log n)
O(1)
O(m log n)
O(m)
We can transform our domain model in a natural way
None
Use cases
Social Networks Follow Follow John Jeff Douglas
Geospatial problems Fraud detection Authorization Network management
Cypher Declarative language ASCII oriented Pattern matching
Cypher Cypher Traverser API Core API Kernel
Cypher a b (a)-->(b)
Cypher clapton cream (clapton)-[:play_in]->(cream) play_in
Follow Follow John Jeff Douglas Cypher (john:User)-[:FOLLOW]->(jeff:User) ! (douglas:User)-[:FOLLOW]->(john:User)
Cypher clapton {name: Eric Clapton} cream (clapton)-[:play_in]->(cream)<-[:labeled]-(blues) play_in {date: 1968}
Blues labeled
Cypher MATCH (a)-—>(b) RETURN a,b;
Cypher MATCH (a)-[:PLAY_IN]—>(b) RETURN a,b;
Cypher MATCH (a)-[:PLAY_IN]—>(g), (g)<-[:LABELED]-(e) RETURN a.name, t.date, e.name;
Cypher MATCH (c {name: ‘clapton’})-[t:PLAY_IN]—>(g), (g)<-[:LABELED]-(e) RETURN c.name, t.date, e.name;
Cypher MATCH (c {name: ‘clapton’})-[t:PLAY_IN]—>(g), (g)<-[:LABELED]-(e {name: ‘blues’}) RETURN c.name,
e.name ORDER BY t.date
Cypher MATCH (c {name: ‘clapton’})-[r:PLAY_IN | PRODUCE]—>(g), (g)<-[:LABELED]-(e {name: ‘blues’})
RETURN c.name, e.name WHERE r.date > 1968 ORDER BY r.date
Cypher MATCH (carlo)-[:KNOW*5]—>(john)
MATCH p = (startNode:Station {name: ‘Sol’}) -[rels:CONNECTED_TO*]-> (endNode:Station {name: ‘Retiro’})
RETURN p AS shortestPath, reduce(weight=0, r in rels: weight + r.weight) as tWeight ORDER BY tWeight ASC LIMIT 1
Recommendation System
Social network
Movies social network Users rate movies People act in movies
People direct movies Users follow other users
Movies social network How do we model it?
Movies social network Follow Rate {stars} User Film User Actor
Director Act in Direct
Movies social network MATCH (fran:User {name: ‘Fran’}) -[or:Rate]-> (pf:Film {title:
‘Pulp Fiction’}), ! (pf)<-[:Rate]-(other_users)-[:Rate]->(other_films) ! RETURN distinct other_films.title;
Movies social network Rate {stars} Rate {stars} User 1 Film
PF Fran User 2 Rate {stars} Film Film Rate {stars} Rate {stars}
Movies social network MATCH (fran:User {name: ‘Fran’}) -[or:Rate]-> (pf:Film {title:
‘Pulp Fiction’}), ! (pf)<-[:Rate]-(other_users)-[r:Rate]->(other_films) ! WHERE or.stars = r.stars ! RETURN distinct other_films.title;
Movies social network MATCH (fran:User {name: ‘Fran’}) -[or:Rate]-> (pf:Film {title:
‘Pulp Fiction’}), ! (pf)<-[:Rate]-(other_users)-[r:Rate]->(other_films), ! (other_users)-[:FOLLOW]-(fran) ! WHERE or.stars = r.stars ! RETURN distinct other_films.title;
Movies social network Rate {star} User 1 Film PF Fran
Rate {stars} Film Follow Rate {star}
Movies social network MATCH (tarantino:User {name: ‘Quentin Tarantino’}), (tarantino)-[:DIRECT]->(movie)<-[:ACT_IN]-(tarantino) RETURN
movie.title
Movies social network Film Actor Director Act_in Direct
Movies social network Now you should be able to categorize
the movies
Movies social network Film SubGenre Belongs_to SubGenre Belongs_to Genre Genre
Belongs_to Belongs_to
Movies social network MATCH (fran:User {name: ‘Fran’}) -[or:Rate]-> (pf:Film {title:
‘Pulp Fiction’}), ! (pf)<-[:Rate]-(other_users)-[r:Rate]->(other_films), (film)->[:BELONGS_TO*3]->(genre)<-[:BELONGS_TO]-(other_films), ! (other_users)-[:FOLLOW]-(fran) ! WHERE or.stars = r.stars ! RETURN distinct other_films.title;
Neo4J extensions Managed Unmanaged
Neo4J extensions Managed Unmanaged
Neo4J extensions Managed Unmanaged
Drivers/Clients
Instead of just picking a relational database because everyone does,
we need to understand the nature of the data we’re storing and how we want to manipulate it. Martin Fowler
References
Neo4J as a service http://www.graphenedb.com
None
Grazie