how shutl delivers even faster using neo4j€¦ · how shutl delivers even faster using neo4j sam...

165

Upload: others

Post on 03-Jan-2021

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips
Page 2: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

How Shutl Delivers Even Faster Using Neo4j

Sam Phillips and Volker Pacher @samsworldofno @vpacher

Page 3: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Volker Pacher

Sam Phillips

Page 4: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Graphs at Shutl

Page 5: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Graphs at Shutl

• Graph databases are awesome

Page 6: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Graphs at Shutl

• Graph databases are awesome

• We’ve seen lots of the talks about modelling

Page 7: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Graphs at Shutl

• Graph databases are awesome

• We’ve seen lots of the talks about modelling

• But querying is important too

Page 8: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Graphs at Shutl

• Graph databases are awesome

• We’ve seen lots of the talks about modelling

• But querying is important too

• So let’s talk about querying too!

Page 9: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Show of hands

Page 10: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Show of hands

• Who has used graph databases before?

Page 11: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Show of hands

• Who has used graph databases before?

• Who has used Neo4j before?

Page 12: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Shutl

Page 13: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Shutl

Page 14: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

ECOMMERCE IS QUICK & CONVENIENT

Page 15: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

ECOMMERCE IS QUICK & CONVENIENT

Page 16: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

PAYPAL FOR AWESOME DELIVERY

Page 17: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

PAYPAL FOR AWESOME DELIVERY

Page 18: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

PAYPAL FOR AWESOME DELIVERY

Branded, super quick delivery that people trust, embedded in merchant websites

Page 19: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

A B

HUB & SPOKE

Page 20: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

A B

HUB & SPOKE

Page 21: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

A B

Only cost effective means to deliver 10+ miles but slow and unpredictable

HUB & SPOKE

Page 22: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

A B

Only cost effective means to deliver 10+ miles but slow and unpredictableHUB & SPOKE

Page 23: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

A B

Only cost effective means to deliver 10+ miles but slow and unpredictableHUB & SPOKE

POINT TO POINT

AB

Page 24: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

A B

Only cost effective means to deliver 10+ miles but slow and unpredictableHUB & SPOKE

POINT TO POINT

Fast and predictable but cost prohibitive over longer distances

AB

Page 25: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

HUB & SPOKE

97% Courier, Express & Parcel Market

Page 26: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

POINT TO POINT

3% Courier, Express & Parcel Market

Page 27: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

POINT TO POINT

3% Courier, Express & Parcel Market

+7,500 more!

Page 28: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

POINT TO POINT

Page 29: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

SHOP

Page 30: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Shutl generates a quote from each relevant carrier within platform

SHOP

$$

$$$

$

$$

$

$

Page 31: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Shutl generates a quote from each relevant carrier within platform

Optimum picked basedon price & quality rating

SHOP

$$

$$$

$

$$

$

$$

Page 32: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

SHOPSHOP

Page 33: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

On checkout, delivery sent via API intochosen carrier’s transportation system

SHOP

$$

SHOP

Page 34: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

On checkout, delivery sent via API intochosen carrier’s transportation system

Courier collects from neareststore and delivers to shopper

SHOP

$$

Page 35: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips
Page 36: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Delivery status updated inreal-time, performancecompared against SLA &carrier quality rating updated

Better performing carriersget more deliveries & candemand higher prices

Page 37: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Delivery status updated inreal-time, performancecompared against SLA &carrier quality rating updated

Better performing carriersget more deliveries & candemand higher prices

Page 38: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Delivery status updated inreal-time, performancecompared against SLA &carrier quality rating updated

Better performing carriersget more deliveries & candemand higher prices

Page 39: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Track your order online…

Page 40: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

FEEDBACK

Quality paramount since we are motivated by LTV of shopper

Page 41: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

FEEDBACK

Quality paramount since we are motivated by LTV of shopper

Page 42: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

FEEDBACK

Shutl sends feedback email to consumer seconds after they have received delivery asking to rate qualitative aspects of experience

Page 43: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

FEEDBACK

Feedback streamed unedited to shutl.com/feedback & facebook

Page 44: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

FEEDBACK

Page 45: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

FEEDBACK

Page 46: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

FEEDBACK

Page 47: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

FEEDBACK

Page 48: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips
Page 49: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

COMPANYSHUTL IS NOW AN

Page 50: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Version OneRuby 1.8, Rails 2.3 and MySQL

Page 51: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Version OneRuby 1.8, Rails 2.3 and MySQL

Page 52: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Version OneRuby 1.8, Rails 2.3 and MySQL

• Well-known tale: built quickly, worked slowly, tough to maintain

• Getting a quote for an hour time-slot took over 4 seconds

Page 53: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Here is the Shutl price calendar

Page 54: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Here is the Shutl price calendar

To generate this in V1, the merchant site would have had to call Shutl to get available slots (2 seconds)

Page 55: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Here is the Shutl price calendar

To generate this in V1, the merchant site would have had to call Shutl to get available slots (2 seconds)

Then, they would have to call Shutl to generate a quote for each slot - for two days of store opening, that’s 20+ slots

Page 56: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Here is the Shutl price calendar

To generate this in V1, the merchant site would have had to call Shutl to get available slots (2 seconds)

Then, they would have to call Shutl to generate a quote for each slot - for two days of store opening, that’s 20+ slots

So, that’s 2 + (20 x 4) seconds, 1:22 to generate the data for this calendar

Page 57: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Here is the Shutl price calendar

To generate this in V1, the merchant site would have had to call Shutl to get available slots (2 seconds)

Then, they would have to call Shutl to generate a quote for each slot - for two days of store opening, that’s 20+ slots

So, that’s 2 + (20 x 4) seconds, 1:22 to generate the data for this calendar

In V1, this UX could never have happened.

Page 58: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

V2

Page 59: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Broke app into services

• Services focused around functions like quoting, booking, and giving feedback

• Key goal for the project was improving the speed of the quoting operation, which is where we used graph databases

V2

Page 60: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

V1

V2

Page 61: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

V1

V2

• Quoting for 20 windows down from 82000 ms to 800 ms

Page 62: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

V1

V2

• Quoting for 20 windows down from 82000 ms to 800 ms

• Code complexity much reduced

Page 63: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

V1

V2

• Quoting for 20 windows down from 82000 ms to 800 ms

• Code complexity much reduced

Page 64: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

A large part of the success of our rewrite was down to the graph database.

Page 65: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

What is a graph anyway?

Page 66: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips
Page 67: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

a collection of vertices (nodes) connected by edges (relationships)

a simple graph

Page 68: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

a short history

Leonard Euler

the seven bridges of Königsberg (1735)!

Page 69: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

the seven bridges of Königsberg (1735)!

Page 70: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

the seven bridges of Königsberg (1735)!

Page 71: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

the seven bridges of Königsberg (1735)!

Page 72: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

the seven bridges of Königsberg (1735)!

Page 73: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

the seven bridges of Königsberg (1735)!

Page 74: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Euler walk

each node has an even degree

Page 75: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Euler walk

Page 76: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Euler walk

Page 77: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Euler walk

two nodes have an odd degree

Page 78: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Euler walk

two nodes have an odd degree

Page 79: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Euler walk

two nodes have an odd degree

no

Page 80: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

directed graph

each relationship has a direction or one start node and one end node

Page 81: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

property graph

Person name: Sam

nodes contain properties (key, value) relationships have a type and are always directed relationships can contain properties too

Person name: Volker

:friends

Person name: Megan

:knows since: 2005

Company name: eBay

:friends

:works_for

:works_for

Page 82: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

The Case for Graph Databases

Page 83: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

relationships are explicit stored

Page 84: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

additive domain modelling

Page 85: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

whiteboard friendly

Page 86: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

traversals of relationships are easy and very fast

Page 87: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

DB performance remains relatively constant as

queries are localised to its portion of the graph.

O(1) for same query

Page 88: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

a graph is its own index (constant query performance)

Page 89: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

a graph is its own index (constant query performance)

Page 90: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

a graph is its own index (constant query performance)

Page 91: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

the case for Neo4j

Page 92: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

standalone or embedded in jvm

Page 93: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

ruby/jruby

Page 94: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

ruby libraries - neo4j gem by Andreas Ronge (https://github.com/andreasronge/neo4j)

Page 95: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

cypher

Page 96: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

the neotech guys are awesome

Page 97: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Querying the graph: Cypher

declarative query language specific to neo4j

easy to learn and intuitive

use specific patterns to query for (something that looks like ‘this’)

inspired partly by SQL (WHERE and ORDER BY) and SPARQL (pattern matching)

focuses on what to query for and not how to query for it

switch from a mySQl world is made easier by the use of cypher instead of having to learn

a traversal framework straight away

Page 98: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

START: Starting points in the graph, obtained via index lookups or by element IDs. MATCH: The graph pattern to match, bound to the starting points in START. WHERE: Filtering criteria. RETURN: What to return. CREATE: Creates nodes and relationships. DELETE: Removes nodes, relationships and properties. SET: Set values to properties. FOREACH: Performs updating actions once per element in a list. WITH: Divides a query into multiple, distinct parts

cypher clauses

Page 99: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

START: Starting points in the graph, obtained via index lookups or by element IDs. MATCH: The graph pattern to match, bound to the starting points in START. WHERE: Filtering criteria. RETURN: What to return. CREATE: Creates nodes and relationships. DELETE: Removes nodes, relationships and properties. SET: Set values to properties. FOREACH: Performs updating actions once per element in a list. WITH: Divides a query into multiple, distinct parts

cypher clauses

START: Starting points in the graph, obtained via index lookups or by element IDs. MATCH: The graph pattern to match, bound to the starting points in START. WHERE: Filtering criteria. RETURN: What to return. CREATE: Creates nodes and relationships. DELETE: Removes nodes, relationships and properties. SET: Set values to properties. FOREACH: Performs updating actions once per element in a list. WITH: Divides a query into multiple, distinct parts

Page 100: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

an example

Person name: Sam

Person name: Volker

:friends

Person name: Megan

:knows since: 2005

Company name: eBay

:friends

:works_for

:works_for

Person name: Jim

:friends

Company name: neotech

:works_for

Page 101: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all the companies my friends work for

MATCH (person{ name:’Volker’ }) -[:friends] - (person) - [:works_for]-> companyRETURN company

Page 102: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all the companies my friends work for

MATCH (person{ name:’Volker’ }) -[:friends] - (person) - [:works_for]-> companyRETURN company

Page 103: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all the companies my friends work for

MATCH (person{ name:’Volker’ }) -[:friends] - (person) - [:works_for]-> companyRETURN company

Person name: Sam

Person name: Volker

:friends

Person name: Megan

:knows since: 2005

Company name: eBay

:friends

:works_for

:works_for

Person name: Jim

:friends

Company name: neotech

:works_for

Page 104: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all the companies my friend’s friends work for

MATCH (person{ name:’Volker’ }) -[:friends*2..2]-(person) - [:works_for] -> company

RETURN company

Page 105: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all the companies my friend’s friends work for

MATCH (person{ name:’Volker’ }) -[:friends*2..2]-(person) - [:works_for] -> company

RETURN company

Page 106: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all the companies my friend’s friends work for

MATCH (person{ name:’Volker’ }) -[:friends*2..2]-(person) - [:works_for] -> company

RETURN company

Person name: Sam

Person name: Volker

:friends

Person name: Megan

:knows since: 2005

Company name: eBay

:friends

:works_for

:works_for

Person name: Jim

:friends

Company name: neotech

:works_for

Page 107: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all my friends who work for neotech

MATCH (person{ name:’Volker’ }) -[:friends] -(friends) - [:works_for]-> companyWHERE company.name = ‘neotech’RETURN friends

Page 108: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all my friends who work for neotech

MATCH (person{ name:’Volker’ }) -[:friends] -(friends) - [:works_for]-> companyWHERE company.name = ‘neotech’RETURN friends

Page 109: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all my friends who work for neotech

MATCH (person{ name:’Volker’ }) -[:friends] -(friends) - [:works_for]-> companyWHERE company.name = ‘neotech’RETURN friends

Person name: Sam

Person name: Volker

:friends

Person name: Megan

:knows since: 2005

Company name: eBay

:friends

:works_for

:works_for

Person name: Jim

:friends

Company name: neotech

:works_for

Page 110: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

a good place to try it out: !

http://console.neo4j.org/ !

http://gist.neo4j.org/

Page 111: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

coverage example

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

:contains

Locality id = 94903

Locality id = 94902

:contains :contains

Page 112: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

coverage example

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

:contains

Locality id = 94903

Locality id = 94902

:contains :contains

Carrier id = carrier_1

:operates :operates

Page 113: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

coverage example

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Locality id = 94903

Locality id = 94902

:contains :contains

Carrier id = carrier_1

:operates :operates

Page 114: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

coverage example

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Locality id = 94903

Locality id = 94902

:contains :contains

:operates Carrier id = carrier_2

Carrier id = carrier_1

:operates :operates

Page 115: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> (locality) <- [:operates]- carrierRETURN carrier

the query

Page 116: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> (locality) <- [:operates]- carrierRETURN carrier

the query

Page 117: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> (locality) <- [:operates]- carrierRETURN carrier

the query

Locality id = 94902

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Locality id = 94903

:contains :contains

Carrier id = carrier_1

:operates :operates

Page 118: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> () <- [:contains*0..2] - (locality) <- [:operates]- carrierRETURN carrier

the query

Page 119: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> () <- [:contains*0..2] - (locality) <- [:operates]- carrierRETURN carrier

the query

Page 120: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> () <- [:contains*0..2] - (locality) <- [:operates]- carrierRETURN carrier

the query

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Locality id = 94903

Locality id = 94902

:contains :contains

:operates Carrier id = carrier_2

Carrier id = carrier_1

:operates :operates

Page 121: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> () <- [:contains*0..2] - (locality) <- [:operates]- carrierRETURN carrier

the query

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Locality id = 94903

Locality id = 94902

:contains :contains

:operates Carrier id = carrier_2

Carrier id = carrier_1

:operates :operates

Page 122: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> () <- [:contains*0..2] - (locality) <- [:operates]- carrierRETURN carrier

the query

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Locality id = 94903

Locality id = 94902

:contains :contains

:operates Carrier id = carrier_2

Carrier id = carrier_1

:operates :operates

Page 123: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> () <- [:contains*0..2] - (locality) <- [:operates]- carrierRETURN carrier

the query

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Locality id = 94903

Locality id = 94902

:contains :contains

:operates Carrier id = carrier_2

Carrier id = carrier_1

:operates :operates

Page 124: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

SELECT * FROM carriers LEFT JOIN locations ON carrier.location_id = location.id LEFT JOIN stores ON stores.location_id = carrier.location_id WHERE stores.name = ‘ebay_store’

Page 125: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

SELECT * FROM carriers LEFT JOIN locations ON carrier.location_id = location.id OR

carrier.location_id = location.parent_id LEFT JOIN stores ON stores.location_id = carrier.location_id WHERE stores.name = ‘ebay_store’

Page 126: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

?

Page 127: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> () <- [:contains*0..2] - (locality) <- [:operates]- carrierRETURN carrier

Page 128: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

root (0)

Year: 2013

Month: 05 Month: 01

:year_2015

:month_01:month_05

:year_2014

Year: 2015

Month: 06

:month_06

Day: 24 Day: 25

:day_24 :day_25

Day: 26

:day_26

Event 1 Event 2 Event 3

:happens :happens :happens :happens

representing dates/times

Page 129: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all events on a specific day

START root=node(0)MATCH root - [:year_2014] -> () -[:month_05] ->

()- [:day_24] -> () - [:happens] -> event RETURN event

Page 130: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all events on a specific daySTART root=node(0)MATCH root - [:year_2014] -> () -[:month_05] ->

()- [:day_24] -> () - [:happens] -> event RETURN event

Page 131: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all events on a specific daySTART root=node(0)MATCH root - [:year_2014] -> () -[:month_05] ->

()- [:day_24] -> () - [:happens] -> event RETURN event root (0)

Year: 2013

Month: 05 Month: 01

:year_2015

:month_01:month_05

:year_2014

Year: 2015

Month: 06

:month_06

Day: 24 Day: 25

:day_24 :day_25

Day: 26

:day_26

Event 1 Event 2 Event 3

:happens :happens :happens :happens

Page 132: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all events on a specific daySTART root=node(0)MATCH root - [:year_2014] -> () -[:month_05] ->

()- [:day_24] -> () - [:happens] -> event RETURN event root (0)

Year: 2013

Month: 05 Month: 01

:year_2015

:month_01:month_05

:year_2014

Year: 2015

Month: 06

:month_06

Day: 24 Day: 25

:day_24 :day_25

Day: 26

:day_26

Event 1 Event 2 Event 3

:happens :happens :happens :happens

Page 133: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all events on a specific daySTART root=node(0)MATCH root - [:year_2014] -> () -[:month_05] ->

()- [:day_24] -> () - [:happens] -> event RETURN event root (0)

Year: 2013

Month: 05 Month: 01

:year_2015

:month_01:month_05

:year_2014

Year: 2015

Month: 06

:month_06

Day: 24 Day: 25

:day_24 :day_25

Day: 26

:day_26

Event 1 Event 2 Event 3

:happens :happens :happens :happens

Page 134: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all events on a specific daySTART root=node(0)MATCH root - [:year_2014] -> () -[:month_05] ->

()- [:day_24] -> () - [:happens] -> event RETURN event root (0)

Year: 2013

Month: 05 Month: 01

:year_2015

:month_01:month_05

:year_2014

Year: 2015

Month: 06

:month_06

Day: 24 Day: 25

:day_24 :day_25

Day: 26

:day_26

Event 1 Event 2 Event 3

:happens :happens :happens :happens

Page 135: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all events on a specific daySTART root=node(0)MATCH root - [:year_2014] -> () -[:month_05] ->

()- [:day_24] -> () - [:happens] -> event RETURN event root (0)

Year: 2013

Month: 05 Month: 01

:year_2015

:month_01:month_05

:year_2014

Year: 2015

Month: 06

:month_06

Day: 24 Day: 25

:day_24 :day_25

Day: 26

:day_26

Event 1 Event 2 Event 3

:happens :happens :happens :happens

Page 136: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

find all events on a specific daySTART root=node(0)MATCH root - [:year_2014] -> () -[:month_05] ->

()- [:day_24] -> () - [:happens] -> event RETURN event root (0)

Year: 2013

Month: 05 Month: 01

:year_2015

:month_01:month_05

:year_2014

Year: 2015

Month: 06

:month_06

Day: 24 Day: 25

:day_24 :day_25

Day: 26

:day_26

Event 1 Event 2 Event 3

:happens :happens :happens :happens

Page 137: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

all together

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Carrier id = carrier_1

:operates

root (0)

Year: 2013

Month: 05

:month_05

:year_2014

Day: 24

:day_24

hour 09

hour 10

:hour_09

:hour_10

hour 11 :hour_11:available {premium: 1}

:available {premium: 1.5}

Page 138: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> (locality) <- [:operates]- carrier -

[available:available] -> () <- [:hour_10] - () <- [:day_24] - () [:month_05] - () [:year_2014] - ()

RETURN carrier, available.premium as premium

all together

Page 139: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> (locality) <- [:operates]- carrier -

[available:available] -> () <- [:hour_10] - () <- [:day_24] - () [:month_05] - () [:year_2014] - ()

RETURN carrier, available.premium as premium

all together

Page 140: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

MATCH (store{ id:’ebay_store’ }) -[:located] -> (locality) <- [:operates]- carrier -

[available:available] -> () <- [:hour_10] - () <- [:day_24] - () [:month_05] - () [:year_2014] - ()

RETURN carrier, available.premium as premium

all together

Locality id = california

Locality id = marin_county

Locality id = 94901

:contains

Store id = ebay_store

:located

:contains

Carrier id = carrier_1

:operates

root (0)

Year: 2013

Month: 05

:month_05

:year_2014

Day: 24

:day_24

hour 09

hour 10

:hour_09

:hour_10

hour 11 :hour_11:available {premium: 1}

:available {premium: 1.5}

Page 141: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Other graph uses

Page 142: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Other graph uses• Recommendation engines

Page 143: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Other graph uses• Recommendation engines

• Organisational analysis

Page 144: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Other graph uses• Recommendation engines

• Organisational analysis

• Graphing your infrastructure

Page 145: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Some gotchas

Page 146: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• There was a learning curve in switching from a relational mentality to a graph one

Some gotchas

Page 147: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• There was a learning curve in switching from a relational mentality to a graph one

• Tooling not as mature as in the relational world

Some gotchas

Page 148: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• There was a learning curve in switching from a relational mentality to a graph one

• Tooling not as mature as in the relational world

• No out of the box solution for db migrations

Some gotchas

Page 149: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• There was a learning curve in switching from a relational mentality to a graph one

• Tooling not as mature as in the relational world

• No out of the box solution for db migrations

• Seeding an embedded database was unfamiliar

Some gotchas

Page 150: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Testing was a challenge

Page 151: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Setting up scenarios for tests was tedious

Testing was a challenge

Page 152: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Setting up scenarios for tests was tedious

• Built our own tool based on the geoff syntax developed by Nigel Small

Testing was a challenge

Page 153: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Setting up scenarios for tests was tedious

• Built our own tool based on the geoff syntax developed by Nigel Small

• Geoff allows modelling of graphs in textual form and provides an

interface to insert them into an existing graph

Testing was a challenge

Page 154: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Setting up scenarios for tests was tedious

• Built our own tool based on the geoff syntax developed by Nigel Small

• Geoff allows modelling of graphs in textual form and provides an

interface to insert them into an existing graph

(A) {“name”: “Alice”}

Testing was a challenge

Page 155: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Setting up scenarios for tests was tedious

• Built our own tool based on the geoff syntax developed by Nigel Small

• Geoff allows modelling of graphs in textual form and provides an

interface to insert them into an existing graph

(A) {“name”: “Alice”}

(B) {“name”: “Bob”}

Testing was a challenge

Page 156: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Setting up scenarios for tests was tedious

• Built our own tool based on the geoff syntax developed by Nigel Small

• Geoff allows modelling of graphs in textual form and provides an

interface to insert them into an existing graph

(A) {“name”: “Alice”}

(B) {“name”: “Bob”}

(A) -[:KNOWS] -> (B)

Testing was a challenge

Page 157: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Setting up scenarios for tests was tedious

• Built our own tool based on the geoff syntax developed by Nigel Small

• Geoff allows modelling of graphs in textual form and provides an

interface to insert them into an existing graph

(A) {“name”: “Alice”}

(B) {“name”: “Bob”}

(A) -[:KNOWS] -> (B)

• We created a Ruby dsl for modelling a graph and inserting it into the db

that works with factory_girl

Testing was a challenge

Page 158: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

• Setting up scenarios for tests was tedious

• Built our own tool based on the geoff syntax developed by Nigel Small

• Geoff allows modelling of graphs in textual form and provides an

interface to insert them into an existing graph

(A) {“name”: “Alice”}

(B) {“name”: “Bob”}

(A) -[:KNOWS] -> (B)

• We created a Ruby dsl for modelling a graph and inserting it into the db

that works with factory_girl

• Open source - https://github.com/shutl/geoff

Testing was a challenge

Page 159: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Wrap Up

Page 160: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Wrap Up

• Neo4j and graph theory enabled Shutl to achieve big performance increases in its most important operation - calculating delivery prices

Page 161: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Wrap Up

• Neo4j and graph theory enabled Shutl to achieve big performance increases in its most important operation - calculating delivery prices

• It’s a new tool based on tested theory, and cypher is the first language that allows you to query graphs in a declarative way (like SQL)

Page 162: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Wrap Up

• Neo4j and graph theory enabled Shutl to achieve big performance increases in its most important operation - calculating delivery prices

• It’s a new tool based on tested theory, and cypher is the first language that allows you to query graphs in a declarative way (like SQL)

• Tooling and adoption is immature but getting better all the time

Page 163: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

Thank you! !

Any questions?

Sam Phillips Head of Engineering

!@samsworldofno

http://samsworldofno.com [email protected]

Volker Pacher Senior Developer !@vpacher https://github.com/vpacher [email protected]

Page 164: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips
Page 165: How Shutl Delivers Even Faster Using Neo4j€¦ · How Shutl Delivers Even Faster Using Neo4j Sam Phillips and Volker Pacher! @samsworldofno @vpacher! Volker Pacher Sam Phillips

our