Upload
dataversity
View
3.286
Download
0
Tags:
Embed Size (px)
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