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
Francisco Fernández Castaño
April 11, 2014
Programming
0
130
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
Tweet
Share
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
85
Graph Databases
fcofdez
1
230
Graph Databases
fcofdez
3
300
Metaprogramming Ruby
fcofdez
1
81
Other Decks in Programming
See All in Programming
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
370
20250628_非エンジニアがバイブコーディングしてみた
ponponmikankan
0
320
Effect の双対、Coeffect
yukikurage
5
1.4k
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
390
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
290
ruby.wasmで多人数リアルタイム通信ゲームを作ろう
lnit
2
200
レガシーシステムの機能調査・開発におけるAI利活用
takuya_ohtonari
0
610
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
460
F#で自在につくる静的ブログサイト - 関数型まつり2025
pizzacat83
0
310
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
230
datadog dash 2025 LLM observability for reliability and stability
ivry_presentationmaterials
0
110
Select API from Kotlin Coroutine
jmatsu
1
190
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Scaling GitHub
holman
459
140k
Automating Front-end Workflow
addyosmani
1370
200k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Fireside Chat
paigeccino
37
3.5k
Unsuck your backbone
ammeep
671
58k
For a Future-Friendly Web
brad_frost
179
9.8k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
33
5.9k
Agile that works and the tools we love
rasmusluckow
329
21k
Typedesign – Prime Four
hannesfritz
42
2.7k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
670
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