Neo4j meets Cassandra :)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/2126895/cassandra-ring_0.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/2126897/neo4j_logo.png)
Hi!
- Computer Engineer
- Programming
- Electronics
- Math <3 <3
- Physics
- Lego
- Meetups
- Animals
- Coffee
- GIFs
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/1527074/cb_16750ae96783c8b6ba983ead7118a873.png)
Graphs are everywhere
We had a talk about MongoDB + Neo4j
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/2126895/cassandra-ring_0.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/2126950/questioning.jpg)
Cassandra!
A short intro about Cassandra
Cassandra's data Model
Item
Item
Feature
Item
Item
Feature
Feature
Screen
Item
Item
Feature
Item
Item
Feature
Feature
Screen
App
Cassandra + Neo4j <3
- Recommendation systems
- Relationships discovery
- Optimised paths
neo4j-cassandra-connector
https://github.com/hannelita/neo4j_doc_manager
Main challenge:
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/2129481/Screen_Shot_2016-01-13_at_4.12.05_PM.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/1639267/Screen_Shot_2015-08-13_at_2.00.42_PM.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/2126950/questioning.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/2109983/tumblr_mryi8ukHbM1r3gb3zo1_400.gif)
Flexibility over mapping via configuration file
CREATE TABLE playlist.statistics:
counter_name text PRIMARY KEY: {i}
counter_value counter: {p}
CREATE TABLE playlist.track_by_artist:
artist text: {r}
track text: {p}
track_id uuid: {i}
genre text: {p}
music_file text: {p}
starred boolean: {p}
track_length_in_seconds int: {p}
PRIMARY KEY (artist {i}, track {p}, track_id {i})
Get a Cassandra Schema
Specify which are properties, or nodes or relationships
{ } => customisable mapping
Each row will be turned into a node
Project Style
CREATE TABLE playlist.statistics:
counter_name text PRIMARY KEY: {i}
counter_value counter: {p}
CREATE TABLE playlist.track_by_artist:
artist text: {r}
track text: {p}
track_id uuid: {i}
genre text: {p}
music_file text: {p}
starred boolean: {p}
track_length_in_seconds int: {p}
PRIMARY KEY (artist {i}, track {p}, track_id {i})
Node Labels
Project Style
CREATE TABLE playlist.statistics:
counter_name text PRIMARY KEY: {i}
counter_value counter: {p}
CREATE TABLE playlist.track_by_artist:
artist text: {r}
track text: {p}
track_id uuid: {i}
genre text: {p}
music_file text: {p}
starred boolean: {p}
track_length_in_seconds int: {p}
PRIMARY KEY (artist {i}, track {p}, track_id {i})
Node Properties:
flexible
Project Style
CREATE TABLE playlist.track_by_artist:
artist text: {r}
track text: {p}
track_id uuid: {i}
genre text: {p}
music_file text: {p}
starred boolean: {p}
track_length_in_seconds int: {p}
PRIMARY KEY (artist {i}, track {p}, track_id {i})
CREATE TABLE playlist.track_by_id:
track_id uuid PRIMARY KEY: {u}
artist text: {r}
genre text: {p}
music_file text: {p}
track text: {p}
track_length_in_seconds int: {p}
Relationship
Project Style
CREATE TABLE playlist.track_by_artist:
artist text: {r}
track text: {p}
track_id uuid: {i}
genre text: {p}
music_file text: {p}
starred boolean: {p}
track_length_in_seconds int: {p}
PRIMARY KEY (artist {i}, track {p}, track_id {i})
CREATE TABLE playlist.track_by_id:
track_id uuid PRIMARY KEY: {u}
artist text: {r}
genre text: {p}
music_file text: {p}
track text: {p}
track_length_in_seconds int: {p}
Relationship
Project Style
CREATE TABLE playlist.track_by_artist:
artist text: {r}
track text: {p}
track_id uuid: {i}
genre text: {p}
music_file text: {p}
starred boolean: {p}
track_length_in_seconds int: {p}
PRIMARY KEY (artist {i}, track {p}, track_id {i})
CREATE TABLE playlist.track_by_id:
track_id uuid PRIMARY KEY: {u}
artist text: {r}
genre text: {p}
music_file text: {p}
track text: {p}
track_length_in_seconds int: {p}
Uniques and Indexes
Project Style
CREATE TABLE playlist.playlist_tracks:
username text: {p}
playlist_name text: {p}
sequence_no timestamp: {p}
artist text: {r}
genre text: {p}
track_id uuid: {i}
track_length_in_seconds int: {p}
track_name text: {p}
PRIMARY KEY ((username {p}, playlist_name {p}) {p}, sequence_no {p})
Also works for inline schema
Challenges
- Parsers!
- Data Structures
- Keep code healthy
- Levels of flexibility
- Performance!
- Open Source! :)
Further work
- Make it smarter
- Inference for the schema
- Query Optimizer
Special Thanks
- @lyonwj
- @mesirii (Michael Hunger) and @ryguyrg
- @neo4j
- @lafp, @romulostores and @pedrofelipee (GIFs)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/304939/images/2125443/tumblr_o0m9p0DQQ91tlb56zo1_400.gif)
Thank you :)
Questions?
hannelita@gmail.com
@hannelita
![](https://s3.amazonaws.com/media-p.slid.es/uploads/hannelitavante-hannelita/images/1244879/animated-gif-jim-carrey-typing-coffee.gif)
Neo4j meets Cassandra :)
By Hanneli Tavante (hannelita)
Neo4j meets Cassandra :)
- 5,780