Case Study: Real-time Recommendations with a Graph Database

183
Realtime Recommendations with a Graph Database Andreas Kollegger #neo4j @akollegger Wednesday, August 24, 11

description

Whether you want to be Facebook or are selling shoelaces online, if you have users then you have a social graph. Reveal the hidden graph in your data by storing key elements in a graph database, focusing on the relationships between records rather than the aggregation of records. We will look at how a large European social network added real-time recommendations to their service with a hybrid of MySQL and Neo4j, covering: Graph concepts refresher: whiteboard friendly modeling Polyglot persistence: storing the right data in the right place Graph algorithms: recommendations for any domain

Transcript of Case Study: Real-time Recommendations with a Graph Database

Page 1: Case Study: Real-time Recommendations with a Graph Database

Realtime Recommendations

with a Graph Database

Andreas Kollegger

#neo4j @akollegger

Wednesday, August 24, 11

Page 2: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

What’s the plan?

๏Graph Database 101

๏Case Study: Viadeo

๏Finding new Friends

๏Recommending new Sites

2

Wednesday, August 24, 11

Page 3: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

3

Wednesday, August 24, 11

Page 4: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Obey!

3

Wednesday, August 24, 11

Page 5: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Obey!

๏tweet using #neo4j

3

Wednesday, August 24, 11

Page 6: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Obey!

๏tweet using #neo4j

๏I am @akollegger

3

Wednesday, August 24, 11

Page 7: Case Study: Real-time Recommendations with a Graph Database

NOSQL Categories

4

Size

Data Complexity

Wednesday, August 24, 11

Page 8: Case Study: Real-time Recommendations with a Graph Database

NOSQL Categories

4

Size

Data Complexity

Key-ValueStore

Wednesday, August 24, 11

Page 9: Case Study: Real-time Recommendations with a Graph Database

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

Wednesday, August 24, 11

Page 10: Case Study: Real-time Recommendations with a Graph Database

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

DocumentDatabases

Wednesday, August 24, 11

Page 11: Case Study: Real-time Recommendations with a Graph Database

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

DocumentDatabases

GraphDatabases

Wednesday, August 24, 11

Page 12: Case Study: Real-time Recommendations with a Graph Database

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

DocumentDatabases

GraphDatabases

Wednesday, August 24, 11

Page 13: Case Study: Real-time Recommendations with a Graph Database

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

DocumentDatabases

GraphDatabases

90%of

usecases

(this is still billionsof nodes &

relationships)

Wednesday, August 24, 11

Page 14: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Graph DB 101(Reading a graph)

5

Wednesday, August 24, 11

Page 15: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

A graph database?

6

Wednesday, August 24, 11

Page 16: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

A graph database?

6

๏no: not for storing charts & graphs, or vector artwork

Wednesday, August 24, 11

Page 17: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

A graph database?

6

๏no: not for storing charts & graphs, or vector artwork

๏yes: for storing data that is structured as a graph

Wednesday, August 24, 11

Page 18: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

A graph database?

6

๏no: not for storing charts & graphs, or vector artwork

๏yes: for storing data that is structured as a graph

• remember linked-list, tree?

Wednesday, August 24, 11

Page 19: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

A graph database?

6

๏no: not for storing charts & graphs, or vector artwork

๏yes: for storing data that is structured as a graph

• remember linked-list, tree?

• graphs are the generalized connected data structure

Wednesday, August 24, 11

Page 20: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

A graph database?

6

๏no: not for storing charts & graphs, or vector artwork

๏yes: for storing data that is structured as a graph

• remember linked-list, tree?

• graphs are the generalized connected data structure

๏whiteboard friendly - no data mangling required

Wednesday, August 24, 11

Page 21: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

A graph database?

6

๏no: not for storing charts & graphs, or vector artwork

๏yes: for storing data that is structured as a graph

• remember linked-list, tree?

• graphs are the generalized connected data structure

๏whiteboard friendly - no data mangling required

๏“A traditional relational database may tell you the average salary of everyone in this conference,

but a graph database will tell you who is most likely to buy you a beer.”

Wednesday, August 24, 11

Page 22: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

7

Q: What are graphs good for?

Wednesday, August 24, 11

Page 23: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

7

๏Recommendations

๏Business intelligence

๏Social computing

๏Geospatial

๏MDM

๏Systems management

๏Genealogy

๏Time series data

๏Product catalogue

๏Web analytics

๏Scientific computing (especially bioinformatics)

๏ Indexing your slow RDBMS

๏And much more!

Q: What are graphs good for?

A: highly-connected data

Wednesday, August 24, 11

Page 24: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

G=(V,E)

8

๏A (Graph) -records data in- (Nodes)

๏A (Graph) -records data in- (Relationships)

๏(Nodes) are -organized by- (Relationships)

๏(Nodes & Relationships) -have- (Properties)

๏ Instead of a Data Model, you have a Data Graph

๏Structure is defined by the Relationships you create

Graph

records data in

Nodes Relationships

Properties

have

organized by

have

records data in

Wednesday, August 24, 11

Page 25: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query a graph with a traversal

๏A (Traversal) -navigates- a (Graph)

๏A (Traversal) -identifies- (Paths)

๏(Paths) -order- (Nodes)

๏Traversals reveal localized data

๏Find data that is relevant to other data

9

Nodes Relationships

organized by

Traversal

identifies

Paths

order

navigatesGraph

records data in records data in

Wednesday, August 24, 11

Page 26: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Indexes look-up Nodes or Relationships

๏An (Index) -maps to either-

(Nodes or Relationships)

๏An (Index) is a -special- (Traversal)

๏ Indexes find starting points for a traversal

๏Can be queried with simple constraints

10

Nodes Relationships

Properties

have

organized by

have

Index

maps from

maps to either maps to either

Traversalspecial

Wednesday, August 24, 11

Page 27: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Neo4j is a Graph Database

๏A (Graph Database) -manages-

a (Graph) and related (Indexes)

๏A Graph Database:

• Full ACID Transactions

•High-Availability (read scaling)

• 32 Billion Nodes, 32 Billion Relationships, 64 Billion Properties

• Server with REST API

•Or, Embeddable as a Java Library

11

Graph Indexes

GraphDatabase

manages manages

lookup

Wednesday, August 24, 11

Page 28: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Neo4j Features

๏Neo4j is stable

• In 24/7 operation since 2003

๏Neo4j is under active development

• open source, with a vibrant community

๏High performance graph operations

• high performance? like what? ...

12

Wednesday, August 24, 11

Page 29: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Example: Social Network “path exists”๏~1,000 persons

๏average 50 friends per person

๏pathExists(a,b) limited to depth 4

๏caches warmed up to eliminate disk I/O

13

# persons query time

Relational database

Neo4j

Neo4j

1,000 2000ms

1,000 2ms

1,000,000 2ms

EmilAndreas

MarcusGabriella

Madeline

Peter

Jacob

Joanne

Wednesday, August 24, 11

Page 30: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Example: Social Network “path exists”๏~1,000 persons

๏average 50 friends per person

๏pathExists(a,b) limited to depth 4

๏caches warmed up to eliminate disk I/O

13

# persons query time

Relational database

Neo4j

Neo4j

1,000 2000ms

1,000 2ms

1,000,000 2ms

EmilAndreas

MarcusGabriella

Madeline

Peter

Jacob

Joanne

Wednesday, August 24, 11

Page 31: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Example: Social Network “path exists”๏~1,000 persons

๏average 50 friends per person

๏pathExists(a,b) limited to depth 4

๏caches warmed up to eliminate disk I/O

13

# persons query time

Relational database

Neo4j

Neo4j

1,000 2000ms

1,000 2ms

1,000,000 2ms

EmilAndreas

MarcusGabriella

Madeline

Peter

Jacob

Joanne

Wednesday, August 24, 11

Page 32: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Example: Social Network “path exists”๏~1,000 persons

๏average 50 friends per person

๏pathExists(a,b) limited to depth 4

๏caches warmed up to eliminate disk I/O

13

# persons query time

Relational database

Neo4j

Neo4j

1,000 2000ms

1,000 2ms

1,000,000 2ms

EmilAndreas

MarcusGabriella

Madeline

Peter

Jacob

Joanne

Wednesday, August 24, 11

Page 33: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo

14

Wednesday, August 24, 11

Page 34: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

14

Wednesday, August 24, 11

Page 35: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

๏the past tech

14

Wednesday, August 24, 11

Page 36: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

๏the past tech

• recommendations running on MySQL as a batch job

14

Wednesday, August 24, 11

Page 37: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

๏the past tech

• recommendations running on MySQL as a batch job

• took an hour, then success happened.. and it took two days

14

Wednesday, August 24, 11

Page 38: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

๏the past tech

• recommendations running on MySQL as a batch job

• took an hour, then success happened.. and it took two days

๏now using Neo4j

14

Wednesday, August 24, 11

Page 39: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

๏the past tech

• recommendations running on MySQL as a batch job

• took an hour, then success happened.. and it took two days

๏now using Neo4j

• recommendations run in real-time

14

Wednesday, August 24, 11

Page 40: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

๏the past tech

• recommendations running on MySQL as a batch job

• took an hour, then success happened.. and it took two days

๏now using Neo4j

• recommendations run in real-time

•what does a recommendation look like?

14

Wednesday, August 24, 11

Page 41: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

๏the past tech

• recommendations running on MySQL as a batch job

• took an hour, then success happened.. and it took two days

๏now using Neo4j

• recommendations run in real-time

•what does a recommendation look like?

14

Wednesday, August 24, 11

Page 42: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Case Study: Viadeo๏Viadeo - 35 million user professional network

๏the past tech

• recommendations running on MySQL as a batch job

• took an hour, then success happened.. and it took two days

๏now using Neo4j

• recommendations run in real-time

•what does a recommendation look like?

๏Check out: http://www.youtube.com/watch?v=sLlbtoCfciE

14

Wednesday, August 24, 11

Page 43: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

A closer look at recommendations

15

Wednesday, August 24, 11

Page 44: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Recommendations 2 ways...

16

Wednesday, August 24, 11

Page 45: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Recommendations 2 ways...

๏Gremlin - graph scripting

16

Wednesday, August 24, 11

Page 46: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Recommendations 2 ways...

๏Gremlin - graph scripting

•an algorithmic approach

16

Wednesday, August 24, 11

Page 47: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Recommendations 2 ways...

๏Gremlin - graph scripting

•an algorithmic approach

๏Cypher - declarative querying

16

Wednesday, August 24, 11

Page 48: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Recommendations 2 ways...

๏Gremlin - graph scripting

•an algorithmic approach

๏Cypher - declarative querying

•a “pattern matching” approach

16

Wednesday, August 24, 11

Page 49: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Recommendations 2 ways...

๏Gremlin - graph scripting

•an algorithmic approach

๏Cypher - declarative querying

•a “pattern matching” approach

๏Stig - functional graph query

16

Wednesday, August 24, 11

Page 50: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Recommendations 2 ways...

๏Gremlin - graph scripting

•an algorithmic approach

๏Cypher - declarative querying

•a “pattern matching” approach

๏Stig - functional graph query

•ok, not yet...16

Wednesday, August 24, 11

Page 51: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin

17

Wednesday, August 24, 11

Page 52: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

17

Wednesday, August 24, 11

Page 53: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

17

Wednesday, August 24, 11

Page 54: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

๏try it out:

17

Wednesday, August 24, 11

Page 55: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

๏try it out:

• g - the graph itself

17

Wednesday, August 24, 11

Page 56: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

๏try it out:

• g - the graph itself

• g.v(0) - node 0

17

Wednesday, August 24, 11

Page 57: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

๏try it out:

• g - the graph itself

• g.v(0) - node 0

• g.v(0).in - nodes connected to Node 0

17

Wednesday, August 24, 11

Page 58: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

๏try it out:

• g - the graph itself

• g.v(0) - node 0

• g.v(0).in - nodes connected to Node 0

• g.v(1).out(“KNOWS”) - nodes connected by “KNOWS”

17

Wednesday, August 24, 11

Page 59: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

๏try it out:

• g - the graph itself

• g.v(0) - node 0

• g.v(0).in - nodes connected to Node 0

• g.v(1).out(“KNOWS”) - nodes connected by “KNOWS”

๏details about Gremlin: https://github.com/tinkerpop/gremlin

17

Wednesday, August 24, 11

Page 60: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

๏try it out:

• g - the graph itself

• g.v(0) - node 0

• g.v(0).in - nodes connected to Node 0

• g.v(1).out(“KNOWS”) - nodes connected by “KNOWS”

๏details about Gremlin: https://github.com/tinkerpop/gremlin

๏props to @twarko for creating it

17

Wednesday, August 24, 11

Page 61: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher

18

Wednesday, August 24, 11

Page 62: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher๏a pattern-matching query language (SQL-ish)

18

Wednesday, August 24, 11

Page 63: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher๏a pattern-matching query language (SQL-ish)

๏developed in-house

18

Wednesday, August 24, 11

Page 64: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher๏a pattern-matching query language (SQL-ish)

๏developed in-house

๏try it out:

18

Wednesday, August 24, 11

Page 65: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher๏a pattern-matching query language (SQL-ish)

๏developed in-house

๏try it out:

• start a=(0) return a - get node 0

18

Wednesday, August 24, 11

Page 66: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher๏a pattern-matching query language (SQL-ish)

๏developed in-house

๏try it out:

• start a=(0) return a - get node 0

• start a=(1) match (a)-->(b) return b - traverse from node 1

18

Wednesday, August 24, 11

Page 67: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher๏a pattern-matching query language (SQL-ish)

๏developed in-house

๏try it out:

• start a=(0) return a - get node 0

• start a=(1) match (a)-->(b) return b - traverse from node 1

• start a=(1) match (a)--()--(c) return c - friends of friends

18

Wednesday, August 24, 11

Page 68: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher๏a pattern-matching query language (SQL-ish)

๏developed in-house

๏try it out:

• start a=(0) return a - get node 0

• start a=(1) match (a)-->(b) return b - traverse from node 1

• start a=(1) match (a)--()--(c) return c - friends of friends

๏details about Cypher:

18

Wednesday, August 24, 11

Page 69: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Cypher๏a pattern-matching query language (SQL-ish)

๏developed in-house

๏try it out:

• start a=(0) return a - get node 0

• start a=(1) match (a)-->(b) return b - traverse from node 1

• start a=(1) match (a)--()--(c) return c - friends of friends

๏details about Cypher:

• http://docs.neo4j.org/chunked/stable/cypher-query-lang.html

18

Wednesday, August 24, 11

Page 70: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

The Social Graphas a Data Graph

19

Wednesday, August 24, 11

Page 71: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

The Usual Social Graph, is also data

20

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 72: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

The Usual Social Graph, is also data

20

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

me

Wednesday, August 24, 11

Page 73: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

with the Usual “status tweets”

21

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 74: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

with the Usual “status tweets”

21

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 75: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

and the Usual Suspects

22

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 76: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

and the Usual Suspects

22

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 77: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

and the Usual Business

23

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 78: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

and the Usual Business

23

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 79: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

and the Usual Likes

24

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 80: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

and the Usual Likes

24

name:Andreas

employer:Neo Technology

worked_at

body: presenting at NoSQL Now! like right now!

status

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes

body: mocking up a simplified social graph

status

url: http://www.imdb.com/title/tt1475582/

likes

knows

name: Peter

employer:Xilinx

worked_at

Wednesday, August 24, 11

Page 81: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Making Friends

25

Wednesday, August 24, 11

Page 82: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

My Expanded Ego Network

26

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 83: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Me & My Friends

27

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 84: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Me & My Friends

27

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 85: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Friends of my Friends

28

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 86: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Friends of my Friends

28

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 87: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Friends of my Friends

28

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 88: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Friend of a Friend of a Friend?

29

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 89: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Friend of a Friend of a Friend?

29

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 90: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Friend of a Friend of a Friend?

29

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Whatever.

Wednesday, August 24, 11

Page 91: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends

30

Wednesday, August 24, 11

Page 92: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, counted

30

Wednesday, August 24, 11

Page 93: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, countedandreas.out('KNOWS').out('KNOWS').name.groupCount(m)

30

Wednesday, August 24, 11

Page 94: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, countedandreas.out('KNOWS').out('KNOWS').name.groupCount(m)

30

Wednesday, August 24, 11

Page 95: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, countedandreas.out('KNOWS').out('KNOWS').name.groupCount(m)

// Cypher - match from andreas to friends to their friends

30

Wednesday, August 24, 11

Page 96: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, countedandreas.out('KNOWS').out('KNOWS').name.groupCount(m)

// Cypher - match from andreas to friends to their friendsstart andreas=(1) match (andreas)-[:KNOWS]->(friends)

30

Wednesday, August 24, 11

Page 97: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, countedandreas.out('KNOWS').out('KNOWS').name.groupCount(m)

// Cypher - match from andreas to friends to their friendsstart andreas=(1) match (andreas)-[:KNOWS]->(friends)

-[:KNOWS]->(foafs) return foafs

30

Wednesday, August 24, 11

Page 98: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, countedandreas.out('KNOWS').out('KNOWS').name.groupCount(m)

// Cypher - match from andreas to friends to their friendsstart andreas=(1) match (andreas)-[:KNOWS]->(friends)

-[:KNOWS]->(foafs) return foafs

30

Wednesday, August 24, 11

Page 99: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, countedandreas.out('KNOWS').out('KNOWS').name.groupCount(m)

// Cypher - match from andreas to friends to their friendsstart andreas=(1) match (andreas)-[:KNOWS]->(friends)

-[:KNOWS]->(foafs) return foafs

// result: Emil, Stephen, Allison (& Peter?)

30

Wednesday, August 24, 11

Page 100: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Friends of Friends// Gremlin - andreas to friends to their friends, countedandreas.out('KNOWS').out('KNOWS').name.groupCount(m)

// Cypher - match from andreas to friends to their friendsstart andreas=(1) match (andreas)-[:KNOWS]->(friends)

-[:KNOWS]->(foafs) return foafs

// result: Emil, Stephen, Allison (& Peter?)

30

Is that good enough?

Wednesday, August 24, 11

Page 101: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Ranking my Friends’ Friends (intuitively)

31

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

Wednesday, August 24, 11

Page 102: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Ranking my Friends’ Friends (intuitively)

31

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

1

Wednesday, August 24, 11

Page 103: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Ranking my Friends’ Friends (intuitively)

31

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

1

2

Wednesday, August 24, 11

Page 104: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Ranking my Friends’ Friends (intuitively)

31

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

1

2

3

Wednesday, August 24, 11

Page 105: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Ranking my Friends’ Friends (intuitively)

31

name:Andreas

name: Markoknows

knows

name: Peter

name: Emil

knows

name: Stephen

knows

knows

name: Delia

knows

knows

name: Tiberius

knows

name: Allisonknows

knows

knows

1

2

3

?

Wednesday, August 24, 11

Page 106: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF

32

Wednesday, August 24, 11

Page 107: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex

32

Wednesday, August 24, 11

Page 108: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights

32

Wednesday, August 24, 11

Page 109: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward

32

Wednesday, August 24, 11

Page 110: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephen

32

Wednesday, August 24, 11

Page 111: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephenandreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name

32

Wednesday, August 24, 11

Page 112: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephenandreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name

.groupCount(m){it}{it+1.0}.back(2)

32

Wednesday, August 24, 11

Page 113: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephenandreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name

.groupCount(m){it}{it+1.0}.back(2).out('KNOWS').except(x).name.groupCount(m){it}{it+0.5}

32

Wednesday, August 24, 11

Page 114: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephenandreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name

.groupCount(m){it}{it+1.0}.back(2).out('KNOWS').except(x).name.groupCount(m){it}{it+0.5}

32

Wednesday, August 24, 11

Page 115: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephenandreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name

.groupCount(m){it}{it+1.0}.back(2).out('KNOWS').except(x).name.groupCount(m){it}{it+0.5}

==>Emil=2.0

32

Wednesday, August 24, 11

Page 116: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephenandreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name

.groupCount(m){it}{it+1.0}.back(2).out('KNOWS').except(x).name.groupCount(m){it}{it+0.5}

==>Emil=2.0==>Allison=2.0

32

Wednesday, August 24, 11

Page 117: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephenandreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name

.groupCount(m){it}{it+1.0}.back(2).out('KNOWS').except(x).name.groupCount(m){it}{it+0.5}

==>Emil=2.0==>Allison=2.0==>Stephen=1.0

32

Wednesday, August 24, 11

Page 118: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Ranked extended FoaF// Gremlin - a bit more complex// - requiring “memory” and weights// - weights decrease with each “hop” outward// - extended hop, to include Stephenandreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name

.groupCount(m){it}{it+1.0}.back(2).out('KNOWS').except(x).name.groupCount(m){it}{it+0.5}

==>Emil=2.0==>Allison=2.0==>Stephen=1.0==>Tiberius=0.5

32

Wednesday, August 24, 11

Page 119: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Like, like this

33

Wednesday, August 24, 11

Page 120: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

What else might I like?

34

name:Andreas

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes:+1

url: http://www.imdb.com/title/tt1475582/

likes:+1

knows

name: Peter

url: http://theoatmeal.com/comics/state_web_summer/

url: http://www.imdb.com/title/tt0133093/

url: http://browsertoolkit.com/fault-tolerance.png

url: http://www.imdb.com/title/tt0436992/

url: http://lensbaby.com/optics-pinhole.php

likes:+1

likes:+2

likes:+1

likes:+1

likes:+2

likes:+3

Wednesday, August 24, 11

Page 121: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

What else might I like?

34

name:Andreas

name: Markoknows

url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/

likes:+1

url: http://www.imdb.com/title/tt1475582/

likes:+1

knows

name: Peter

url: http://theoatmeal.com/comics/state_web_summer/

url: http://www.imdb.com/title/tt0133093/

url: http://browsertoolkit.com/fault-tolerance.png

url: http://www.imdb.com/title/tt0436992/

url: http://lensbaby.com/optics-pinhole.php

likes:+1

likes:+2

likes:+1

likes:+1

likes:+2

likes:+3

Wednesday, August 24, 11

Page 122: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like

35

Wednesday, August 24, 11

Page 123: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends like

35

Wednesday, August 24, 11

Page 124: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

35

Wednesday, August 24, 11

Page 125: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

35

Wednesday, August 24, 11

Page 126: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

35

Wednesday, August 24, 11

Page 127: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+

35

Wednesday, August 24, 11

Page 128: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |

35

Wednesday, August 24, 11

Page 129: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+

35

Wednesday, August 24, 11

Page 130: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png |

35

Wednesday, August 24, 11

Page 131: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png || http://www.imdb.com/title/tt0436992 |

35

Wednesday, August 24, 11

Page 132: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png || http://www.imdb.com/title/tt0436992 || http://lensbaby.com/optics-pinhole.php |

35

Wednesday, August 24, 11

Page 133: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png || http://www.imdb.com/title/tt0436992 || http://lensbaby.com/optics-pinhole.php || http://theoatmeal.com/comics/state_web_summer/ |

35

Wednesday, August 24, 11

Page 134: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png || http://www.imdb.com/title/tt0436992 || http://lensbaby.com/optics-pinhole.php || http://theoatmeal.com/comics/state_web_summer/ || http://www.imdb.com/title/tt0133093 |

35

Wednesday, August 24, 11

Page 135: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png || http://www.imdb.com/title/tt0436992 || http://lensbaby.com/optics-pinhole.php || http://theoatmeal.com/comics/state_web_summer/ || http://www.imdb.com/title/tt0133093 || http://browsertoolkit.com/fault-tolerance.png |

35

Wednesday, August 24, 11

Page 136: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png || http://www.imdb.com/title/tt0436992 || http://lensbaby.com/optics-pinhole.php || http://theoatmeal.com/comics/state_web_summer/ || http://www.imdb.com/title/tt0133093 || http://browsertoolkit.com/fault-tolerance.png |+------------------------------------------------+

35

Wednesday, August 24, 11

Page 137: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// Cypher - websites my friends likestart andreas=(1) match (andreas)-[:KNOWS]->(friend)

-[:LIKES]->(website) return website.url

+------------------------------------------------+| website.url |+------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png || http://www.imdb.com/title/tt0436992 || http://lensbaby.com/optics-pinhole.php || http://theoatmeal.com/comics/state_web_summer/ || http://www.imdb.com/title/tt0133093 || http://browsertoolkit.com/fault-tolerance.png |+------------------------------------------------+6 rows, 4 ms

35

Wednesday, August 24, 11

Page 138: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like

36

Wednesday, August 24, 11

Page 139: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average rating

36

Wednesday, August 24, 11

Page 140: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

36

Wednesday, August 24, 11

Page 141: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus)

36

Wednesday, August 24, 11

Page 142: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

36

Wednesday, August 24, 11

Page 143: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+

36

Wednesday, August 24, 11

Page 144: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |

36

Wednesday, August 24, 11

Page 145: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |+--------------------------------------------------------------+

36

Wednesday, August 24, 11

Page 146: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |+--------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 |

36

Wednesday, August 24, 11

Page 147: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |+--------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 || http://www.imdb.com/title/tt0436992 | 2.0 |

36

Wednesday, August 24, 11

Page 148: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |+--------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 || http://www.imdb.com/title/tt0436992 | 2.0 || http://www.imdb.com/title/tt0133093 | 2.0 |

36

Wednesday, August 24, 11

Page 149: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |+--------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 || http://www.imdb.com/title/tt0436992 | 2.0 || http://www.imdb.com/title/tt0133093 | 2.0 || http://theoatmeal.com/comics/state_web_summer/ | 1.0 |

36

Wednesday, August 24, 11

Page 150: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |+--------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 || http://www.imdb.com/title/tt0436992 | 2.0 || http://www.imdb.com/title/tt0133093 | 2.0 || http://theoatmeal.com/comics/state_web_summer/ | 1.0 || http://browsertoolkit.com/fault-tolerance.png | 1.0 |

36

Wednesday, August 24, 11

Page 151: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |+--------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 || http://www.imdb.com/title/tt0436992 | 2.0 || http://www.imdb.com/title/tt0133093 | 2.0 || http://theoatmeal.com/comics/state_web_summer/ | 1.0 || http://browsertoolkit.com/fault-tolerance.png | 1.0 |+--------------------------------------------------------------+

36

Wednesday, August 24, 11

Page 152: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus) ORDER BY AVG(l.plus) DESC

+--------------------------------------------------------------+| website.url | avg(l.plus) |+--------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 || http://www.imdb.com/title/tt0436992 | 2.0 || http://www.imdb.com/title/tt0133093 | 2.0 || http://theoatmeal.com/comics/state_web_summer/ | 1.0 || http://browsertoolkit.com/fault-tolerance.png | 1.0 |+--------------------------------------------------------------+5 rows, 5 ms

36

Wednesday, August 24, 11

Page 153: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like

37

Wednesday, August 24, 11

Page 154: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average rating

37

Wednesday, August 24, 11

Page 155: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

37

Wednesday, August 24, 11

Page 156: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

37

Wednesday, August 24, 11

Page 157: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+

37

Wednesday, August 24, 11

Page 158: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |

37

Wednesday, August 24, 11

Page 159: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-------------------------------------------------------------------------+

37

Wednesday, August 24, 11

Page 160: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-------------------------------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png | 1.0 | 2 |

37

Wednesday, August 24, 11

Page 161: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-------------------------------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png | 1.0 | 2 || http://lensbaby.com/optics-pinhole.php | 3.0 | 1 |

37

Wednesday, August 24, 11

Page 162: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-------------------------------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png | 1.0 | 2 || http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 |

37

Wednesday, August 24, 11

Page 163: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-------------------------------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png | 1.0 | 2 || http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 || http://www.imdb.com/title/tt0133093 | 2.0 | 1 |

37

Wednesday, August 24, 11

Page 164: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-------------------------------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png | 1.0 | 2 || http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 || http://www.imdb.com/title/tt0133093 | 2.0 | 1 || http://theoatmeal.com/comics/state_web_summer/ | 1.0 | 1 |

37

Wednesday, August 24, 11

Page 165: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-------------------------------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png | 1.0 | 2 || http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 || http://www.imdb.com/title/tt0133093 | 2.0 | 1 || http://theoatmeal.com/comics/state_web_summer/ | 1.0 | 1 |+-------------------------------------------------------------------------+

37

Wednesday, August 24, 11

Page 166: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered by number of ratings, then average ratingstart andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-------------------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-------------------------------------------------------------------------+| http://browsertoolkit.com/fault-tolerance.png | 1.0 | 2 || http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 || http://www.imdb.com/title/tt0133093 | 2.0 | 1 || http://theoatmeal.com/comics/state_web_summer/ | 1.0 | 1 |+-------------------------------------------------------------------------+5 rows, 7 ms

37

Wednesday, August 24, 11

Page 167: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like

38

Wednesday, August 24, 11

Page 168: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1

38

Wednesday, August 24, 11

Page 169: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

38

Wednesday, August 24, 11

Page 170: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website)

38

Wednesday, August 24, 11

Page 171: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

38

Wednesday, August 24, 11

Page 172: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*)

38

Wednesday, August 24, 11

Page 173: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

38

Wednesday, August 24, 11

Page 174: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-----------------------------------------------------------------+

38

Wednesday, August 24, 11

Page 175: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-----------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |

38

Wednesday, August 24, 11

Page 176: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-----------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-----------------------------------------------------------------+

38

Wednesday, August 24, 11

Page 177: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-----------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-----------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 | 1 |

38

Wednesday, August 24, 11

Page 178: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-----------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-----------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 |

38

Wednesday, August 24, 11

Page 179: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-----------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-----------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 || http://www.imdb.com/title/tt0133093 | 2.0 | 1 |

38

Wednesday, August 24, 11

Page 180: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-----------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-----------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 || http://www.imdb.com/title/tt0133093 | 2.0 | 1 |+-----------------------------------------------------------------+

38

Wednesday, August 24, 11

Page 181: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Query for Things to Like// ordered, grouped, rated higher than 1start andreas=(1) MATCH (andreas)-[:KNOWS]->(friend)

-[l:LIKES]->(website) WHERE l.plus>1

return website.url, AVG(l.plus), count(*) ORDER BY count(*) DESC, AVG(l.plus) DESC

+-----------------------------------------------------------------+| website.url | avg(l.plus) | count(*) |+-----------------------------------------------------------------+| http://lensbaby.com/optics-pinhole.php | 3.0 | 1 || http://www.imdb.com/title/tt0436992 | 2.0 | 1 || http://www.imdb.com/title/tt0133093 | 2.0 | 1 |+-----------------------------------------------------------------+3 rows, 91 ms

38

Wednesday, August 24, 11

Page 182: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

What else would you recommend? ๏Continue to elaborate the graph, and the algorithm

•more variables reveal more nuances in results

๏Rank influence of each user

• PageRank, Centrality, pick-an-algorithm

•Modulate weights by user rank

39

Wednesday, August 24, 11

Page 183: Case Study: Real-time Recommendations with a Graph Database

Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j

Questions?

๏learn more at http://neo4j.org

๏join the mailing list

๏join a meetup, or start one and we’ll come to you

40

Wednesday, August 24, 11