Case Study: Real-time Recommendations with a Graph Database

Preview:

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

Citation preview

Realtime Recommendations

with a Graph Database

Andreas Kollegger

#neo4j @akollegger

Wednesday, August 24, 11

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

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

3

Wednesday, August 24, 11

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

Obey!

3

Wednesday, August 24, 11

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

Obey!

๏tweet using #neo4j

3

Wednesday, August 24, 11

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

Obey!

๏tweet using #neo4j

๏I am @akollegger

3

Wednesday, August 24, 11

NOSQL Categories

4

Size

Data Complexity

Wednesday, August 24, 11

NOSQL Categories

4

Size

Data Complexity

Key-ValueStore

Wednesday, August 24, 11

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

Wednesday, August 24, 11

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

DocumentDatabases

Wednesday, August 24, 11

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

DocumentDatabases

GraphDatabases

Wednesday, August 24, 11

NOSQL Categories

4

Size BigTable

Clones

Data Complexity

Key-ValueStore

DocumentDatabases

GraphDatabases

Wednesday, August 24, 11

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

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

Graph DB 101(Reading a graph)

5

Wednesday, August 24, 11

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

A graph database?

6

Wednesday, August 24, 11

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

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

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

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

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

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

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

7

Q: What are graphs good for?

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

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

Case Study: Viadeo

14

Wednesday, August 24, 11

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

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

14

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

A closer look at recommendations

15

Wednesday, August 24, 11

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

Recommendations 2 ways...

16

Wednesday, August 24, 11

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

Recommendations 2 ways...

๏Gremlin - graph scripting

16

Wednesday, August 24, 11

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

Recommendations 2 ways...

๏Gremlin - graph scripting

•an algorithmic approach

16

Wednesday, August 24, 11

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

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

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

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

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

Gremlin

17

Wednesday, August 24, 11

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

Gremlin๏a graph scripting DSL

17

Wednesday, August 24, 11

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

Gremlin๏a graph scripting DSL

๏part of the TinkerPop stack

17

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

Cypher

18

Wednesday, August 24, 11

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

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

18

Wednesday, August 24, 11

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

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

๏developed in-house

18

Wednesday, August 24, 11

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

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

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

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

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

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

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

The Social Graphas a Data Graph

19

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

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

Making Friends

25

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

Query for Friends of Friends

30

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Query for Ranked extended FoaF

32

Wednesday, August 24, 11

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

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

32

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

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

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

Like, like this

33

Wednesday, August 24, 11

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

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

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

Query for Things to Like

35

Wednesday, August 24, 11

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

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

35

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Query for Things to Like

36

Wednesday, August 24, 11

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

Query for Things to Like// ordered by average rating

36

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Query for Things to Like

37

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Query for Things to Like

38

Wednesday, August 24, 11

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

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

38

Wednesday, August 24, 11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Recommended