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
8. NOSQL Categories
Key-Value
Store
Size
Data Complexity
4
Wednesday, August 24, 11
9. NOSQL Categories
Key-Value
Store
Size
BigTable
Clones
Data Complexity
4
Wednesday, August 24, 11
10. NOSQL Categories
Key-Value
Store
Size
BigTable
Clones
Document
Databases
Data Complexity
4
Wednesday, August 24, 11
11. NOSQL Categories
Key-Value
Store
Size
BigTable
Clones
Document
Databases
Graph
Databases
Data Complexity
4
Wednesday, August 24, 11
12. NOSQL Categories
Key-Value
Store
Size
BigTable
Clones
Document
Databases
Graph
Databases
Data Complexity
4
Wednesday, August 24, 11
13. NOSQL Categories
Key-Value
Store (this is still billions
Size
BigTable of nodes &
Clones relationships)
Document
Databases
Graph
90%
Databases
of
use
cases
Data Complexity
4
Wednesday, August 24, 11
14. Graph DB 101
(Reading a graph)
5
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
15. A graph database?
6
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
16. A graph database?
๏ no: not for storing charts & graphs, or vector artwork
6
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
17. A graph database?
๏ no: not for storing charts & graphs, or vector artwork
๏ yes: for storing data that is structured as a graph
6
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
18. A graph database?
๏ no: not for storing charts & graphs, or vector artwork
๏ yes: for storing data that is structured as a graph
• remember linked-list, tree?
6
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
19. A graph database?
๏ 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
6
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
20. A graph database?
๏ 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
6
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
21. A graph database?
๏ 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.”
6
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
22. Q: What are graphs good for?
7
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
23. Q: What are graphs good for?
A: highly-connected data
๏ Recommendations ๏ Time series data
๏ Business intelligence ๏ Product catalogue
๏ Social computing ๏ Web analytics
๏ Geospatial ๏ Scientific computing (especially
bioinformatics)
๏ MDM
๏ Systems management ๏ Indexing your slow RDBMS
๏ Genealogy
๏ And much more!
7
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
24. G=(V,E)
๏ A (Graph) -records data in- (Nodes) Graph
๏ A (Graph) -records data in- (Relationships)
records data in records data in
organized by
๏ (Nodes) are -organized by- (Relationships)
Nodes Relationships
have have
๏ (Nodes & Relationships) -have- (Properties) Properties
๏ Instead of a Data Model, you have a Data Graph
๏ Structure is defined by the Relationships you create
8
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
25. Query a graph with a traversal
๏ A (Traversal) -navigates- a (Graph)
Traversal
identifies navigates
๏ A (Traversal) -identifies- (Paths) Paths
Graph
๏ (Paths) -order- (Nodes) records data in records data in
order
organized by
Nodes Relationships
๏ Traversals reveal localized data
๏ Find data that is relevant to other data
9
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
26. Indexes look-up Nodes or Relationships
๏ An (Index) -maps to either- Index special Traversal
(Nodes or Relationships) maps to either maps to either
๏ An (Index) is a -special- (Traversal)
organized by
Nodes Relationships
maps from
have have
๏ Indexes find starting points for a traversal
Properties
๏ Can be queried with simple constraints
10
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
27. Neo4j is a Graph Database
๏ A (Graph Database) -manages- Graph
Database
a (Graph) and related (Indexes) manages manages
๏ A Graph Database:
lookup
Graph Indexes
• 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
28. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
29. Example: Social Network “path exists”
๏ ~1,000 persons
Madeline
๏ average 50 friends per person
Andreas Emil Joanne
๏ pathExists(a,b) limited to depth 4 Gabriella Marcus Peter
๏ caches warmed up to eliminate disk I/O Jacob
# persons query time
Relational database 1,000 2000ms
Neo4j 1,000 2ms
Neo4j 1,000,000 2ms
13
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
30. Example: Social Network “path exists”
๏ ~1,000 persons
Madeline
๏ average 50 friends per person
Andreas Emil Joanne
๏ pathExists(a,b) limited to depth 4 Gabriella Marcus Peter
๏ caches warmed up to eliminate disk I/O Jacob
# persons query time
Relational database 1,000 2000ms
Neo4j 1,000 2ms
Neo4j 1,000,000 2ms
13
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
31. Example: Social Network “path exists”
๏ ~1,000 persons
Madeline
๏ average 50 friends per person
Andreas Emil Joanne
๏ pathExists(a,b) limited to depth 4 Gabriella Marcus Peter
๏ caches warmed up to eliminate disk I/O Jacob
# persons query time
Relational database 1,000 2000ms
Neo4j 1,000 2ms
Neo4j 1,000,000 2ms
13
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
32. Example: Social Network “path exists”
๏ ~1,000 persons
Madeline
๏ average 50 friends per person
Andreas Emil Joanne
๏ pathExists(a,b) limited to depth 4 Gabriella Marcus Peter
๏ caches warmed up to eliminate disk I/O Jacob
# persons query time
Relational database 1,000 2000ms
Neo4j 1,000 2ms
Neo4j 1,000,000 2ms
13
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
33. Case Study: Viadeo
14
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
34. Case Study: Viadeo
๏ Viadeo - 35 million user professional network
14
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
35. Case Study: Viadeo
๏ Viadeo - 35 million user professional network
๏ the past tech
14
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
36. Case Study: Viadeo
๏ Viadeo - 35 million user professional network
๏ the past tech
• recommendations running on MySQL as a batch job
14
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
37. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
38. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
39. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
40. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
41. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
42. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
43. A closer look at
recommendations
15
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
44. Recommendations 2 ways...
16
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
45. Recommendations 2 ways...
๏Gremlin - graph scripting
16
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
46. Recommendations 2 ways...
๏Gremlin - graph scripting
• an algorithmic approach
16
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
47. Recommendations 2 ways...
๏Gremlin - graph scripting
• an algorithmic approach
๏Cypher - declarative querying
16
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
48. Recommendations 2 ways...
๏Gremlin - graph scripting
• an algorithmic approach
๏Cypher - declarative querying
• a “pattern matching” approach
16
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
49. Recommendations 2 ways...
๏Gremlin - graph scripting
• an algorithmic approach
๏Cypher - declarative querying
• a “pattern matching” approach
๏Stig - functional graph query
16
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
50. Recommendations 2 ways...
๏Gremlin - graph scripting
• an algorithmic approach
๏Cypher - declarative querying
• a “pattern matching” approach
๏Stig - functional graph query
• ok, not yet...
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
16
Wednesday, August 24, 11
51. Gremlin
17
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
52. Gremlin
๏ a graph scripting DSL
17
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
53. Gremlin
๏ a graph scripting DSL
๏ part of the TinkerPop stack
17
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
54. Gremlin
๏ a graph scripting DSL
๏ part of the TinkerPop stack
๏ try it out:
17
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
55. Gremlin
๏ a graph scripting DSL
๏ part of the TinkerPop stack
๏ try it out:
• g - the graph itself
17
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
56. Gremlin
๏ a graph scripting DSL
๏ part of the TinkerPop stack
๏ try it out:
• g - the graph itself
• g.v(0) - node 0
17
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
57. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
58. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
59. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
60. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
61. Cypher
18
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
62. Cypher
๏ a pattern-matching query language (SQL-ish)
18
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
63. Cypher
๏ a pattern-matching query language (SQL-ish)
๏ developed in-house
18
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
64. Cypher
๏ a pattern-matching query language (SQL-ish)
๏ developed in-house
๏ try it out:
18
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
65. Cypher
๏ a pattern-matching query language (SQL-ish)
๏ developed in-house
๏ try it out:
• start a=(0) return a - get node 0
18
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
66. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
67. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
68. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
69. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
70. The Social Graph
as a Data Graph
19
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
71. The Usual Social Graph, is also data
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
20
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
72. The Usual Social Graph, is also data
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
me knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
20
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
73. with the Usual “status tweets”
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
21
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
74. with the Usual “status tweets”
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
21
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
75. and the Usual Suspects
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
22
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
76. and the Usual Suspects
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
22
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
77. and the Usual Business
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
23
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
78. and the Usual Business
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
23
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
79. and the Usual Likes
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
24
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
80. and the Usual Likes
status body: presenting at NoSQL
name:Andreas
Now! like right now!
status
knows name: Marko
knows body: mocking up a simplified
social graph
worked_at name: Peter
likes
employer:Neo Technology employer:Xilinx
likes
worked_at
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
24
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
81. Making Friends
25
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
82. My Expanded Ego Network
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
26
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
83. Me & My Friends
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
27
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
84. Me & My Friends
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
27
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
85. Friends of my Friends
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
28
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
86. Friends of my Friends
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
28
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
87. Friends of my Friends
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
28
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
88. Friend of a Friend of a Friend?
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
29
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
89. Friend of a Friend of a Friend?
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
29
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
90. Friend of a Friend of a Friend?
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
Whatever.
29
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
91. Query for Friends of Friends
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
92. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
93. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
andreas.out('KNOWS').out('KNOWS').name.groupCount(m)
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
94. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
andreas.out('KNOWS').out('KNOWS').name.groupCount(m)
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
95. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
andreas.out('KNOWS').out('KNOWS').name.groupCount(m)
// Cypher - match from andreas to friends to their friends
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
96. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
andreas.out('KNOWS').out('KNOWS').name.groupCount(m)
// Cypher - match from andreas to friends to their friends
start andreas=(1) match (andreas)-[:KNOWS]->(friends)
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
97. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
andreas.out('KNOWS').out('KNOWS').name.groupCount(m)
// Cypher - match from andreas to friends to their friends
start andreas=(1) match (andreas)-[:KNOWS]->(friends)
-[:KNOWS]->(foafs) return foafs
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
98. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
andreas.out('KNOWS').out('KNOWS').name.groupCount(m)
// Cypher - match from andreas to friends to their friends
start andreas=(1) match (andreas)-[:KNOWS]->(friends)
-[:KNOWS]->(foafs) return foafs
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
99. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
andreas.out('KNOWS').out('KNOWS').name.groupCount(m)
// Cypher - match from andreas to friends to their friends
start andreas=(1) match (andreas)-[:KNOWS]->(friends)
-[:KNOWS]->(foafs) return foafs
// result: Emil, Stephen, Allison (& Peter?)
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
100. Query for Friends of Friends
// Gremlin - andreas to friends to their friends, counted
andreas.out('KNOWS').out('KNOWS').name.groupCount(m)
// Cypher - match from andreas to friends to their friends
start andreas=(1) match (andreas)-[:KNOWS]->(friends)
-[:KNOWS]->(foafs) return foafs
// result: Emil, Stephen, Allison (& Peter?)
Is that good enough?
30
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
101. Ranking my Friends’ Friends (intuitively)
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
knows
knows name: Emil
knows name: Allison
knows
31
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
102. Ranking my Friends’ Friends (intuitively)
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
1
knows
knows name: Emil
knows name: Allison
knows
31
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
103. Ranking my Friends’ Friends (intuitively)
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
1
knows
knows name: Emil
2
knows name: Allison
knows
31
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
104. Ranking my Friends’ Friends (intuitively)
3
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
name: Delia name: Tiberius
knows
1
knows
knows name: Emil
2
knows name: Allison
knows
31
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
105. Ranking my Friends’ Friends (intuitively)
3
name:Andreas
knows
knows name: Marko
knows name: Stephen
knows knows
knows
name: Peter
?
name: Delia name: Tiberius
knows
1
knows
knows name: Emil
2
knows name: Allison
knows
31
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
106. Query for Ranked extended FoaF
32
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
107. Query for Ranked extended FoaF
// Gremlin - a bit more complex
32
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
108. Query for Ranked extended FoaF
// Gremlin - a bit more complex
// - requiring “memory” and weights
32
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
109. Query for Ranked extended FoaF
// Gremlin - a bit more complex
// - requiring “memory” and weights
// - weights decrease with each “hop” outward
32
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
110. 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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
111. 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
andreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name
32
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
112. 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
andreas.out('KNOWS').aggregate(x).out('KNOWS').except(x).name
.groupCount(m){it}{it+1.0}.back(2)
32
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
113. 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
andreas.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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
114. 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
andreas.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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
115. 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
andreas.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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
116. 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
andreas.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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
117. 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
andreas.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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
118. 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
andreas.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
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
119. Like, like this
33
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
120. What else might I like?
url: http://theoatmeal.com/comics/
name:Andreas
state_web_summer/
likes:+1
knows name: Marko
likes:+2 url: http://www.imdb.com/title/tt0133093/
knows
likes:+1
name: Peter likes:+1 url: http://browsertoolkit.com/fault-
tolerance.png
likes:+1
likes:+2
url: http://www.imdb.com/title/tt0436992/
likes:+1
likes:+3
url: http://lensbaby.com/optics-pinhole.php
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
34
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
121. What else might I like?
url: http://theoatmeal.com/comics/
name:Andreas
state_web_summer/
likes:+1
knows name: Marko
likes:+2 url: http://www.imdb.com/title/tt0133093/
knows
likes:+1
name: Peter likes:+1 url: http://browsertoolkit.com/fault-
tolerance.png
likes:+1
likes:+2
url: http://www.imdb.com/title/tt0436992/
likes:+1
likes:+3
url: http://lensbaby.com/optics-pinhole.php
url: http://www.amazon.com/Nikon-14-24mm-2-8G-Nikkor-Angle/dp/B000VDCTCI/
url: http://www.imdb.com/title/tt1475582/
34
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
122. Query for Things to Like
35
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
123. Query for Things to Like
// Cypher - websites my friends like
35
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
124. Query for Things to Like
// Cypher - websites my friends like
start andreas=(1) match (andreas)-[:KNOWS]->(friend)
35
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
125. Query for Things to Like
// Cypher - websites my friends like
start andreas=(1) match (andreas)-[:KNOWS]->(friend)
-[:LIKES]->(website) return website.url
35
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
126. Query for Things to Like
// Cypher - websites my friends like
start andreas=(1) match (andreas)-[:KNOWS]->(friend)
-[:LIKES]->(website) return website.url
35
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
127. Query for Things to Like
// Cypher - websites my friends like
start andreas=(1) match (andreas)-[:KNOWS]->(friend)
-[:LIKES]->(website) return website.url
+------------------------------------------------+
35
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
128. Query for Things to Like
// Cypher - websites my friends like
start andreas=(1) match (andreas)-[:KNOWS]->(friend)
-[:LIKES]->(website) return website.url
+------------------------------------------------+
| website.url |
35
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11
129. Query for Things to Like
// Cypher - websites my friends like
start andreas=(1) match (andreas)-[:KNOWS]->(friend)
-[:LIKES]->(website) return website.url
+------------------------------------------------+
| website.url |
+------------------------------------------------+
35
Andreas Kollegger --[known_as]--> @akollegger --[talks_about]--> #neo4j
Wednesday, August 24, 11