graphconnect 2014 sf: betting the company on a graph database - part 2

63
BETTING THE COMPANY (AGAIN?!) ON A GRAPH DATABASE THE STORY CONTINUED… Aseem Kishore Oct 2014

Upload: neo4j-the-fastest-and-most-scalable-native-graph-database

Post on 30-Jun-2015

684 views

Category:

Technology


0 download

DESCRIPTION

GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2 presented by Aseem Kishore, FiftyThree

TRANSCRIPT

Page 1: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

BETTING THE COMPANY(AGAIN?!) ON A

GRAPH DATABASETHE STORY CONTINUED…

Aseem KishoreOct 2014

Page 2: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 3: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 4: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 6: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

MIX GRAPHSBRINGING IDEAS TOGETHER

Page 7: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 8: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 9: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 10: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 11: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

MIX NEO4J

Page 12: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 13: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 14: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 15: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 16: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 17: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 18: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 19: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 20: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 21: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

MIX GRAPHS

Page 22: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 23: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 24: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 25: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 26: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 27: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 28: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 29: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 30: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 31: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

STREAMSMATCH (me:User {id: {id}})MATCH (me) <-[:creator]- (creation)

RETURN creation

Page 32: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

PAGINATION (BAD)MATCH (me:User {id: {id}})MATCH (me) <-[:creator]- (creation)

RETURN creationORDER BY creation.createdAt DESCSKIP {count} * {page - 1}LIMIT {count}

Page 33: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

PAGINATION (GOOD)MATCH (me:User {id: {id}})MATCH (me) <-[:creator]- (creation)

WHERE creation.createdAt < {cursorTime}RETURN creationORDER BY creation.createdAt DESCLIMIT {count}

Page 34: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 35: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 36: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 37: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 38: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

REMIX FAMILIESMATCH (c:Creation {id: {id}})MATCH (c) -[:remix_source*0..]- (relative)

WHERE relative.createdAt < {cursorTime}RETURN relativeORDER BY relative.createdAt DESCLIMIT {count}

Page 39: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 40: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 41: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 42: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

HOME STREAM 1MATCH (me:User {id: {id}})MATCH (me) -[:follows]-> (f) <-[:creator]- (creation)

WHERE creation.createdAt < {cursorTime}RETURN creationORDER BY creation.createdAt DESCLIMIT {count}

Page 43: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

HOME STREAM 2MATCH (me:User {id: {id}})MATCH (me) -[:follows]-> (f) -[star:starred]-> (creation)

WITH creation, starORDER BY star.createdAtWITH creation, HEAD(COLLECT(star)) AS star

WHERE star.createdAt < {cursorTime}RETURN creation, star.createdAt AS _starredAtORDER BY _starredAt DESCLIMIT {count}

Page 44: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

HOME STREAM 3MATCH (me:User {id: {id}})MATCH (me) -[:starred]-> (c) <-[:remix_source*]- (remix)

WHERE remix.createdAt < {cursorTime}RETURN DISTINCT remixORDER BY remix.createdAt DESCLIMIT {count}

Page 45: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

UNION?

Page 46: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 47: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 48: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

UNTIL THEN…nodes = _(results).chain().flatten() .sortBy (node) -> node._orderedAt .unique (node) -> node.id .reverse().value()

Post-processing on our server.

Page 49: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

DEDUPING (VERY BAD)MATCH (me:User {id: {id}})MATCH (me) -[:follows]-> (f) -[star:starred]-> (creation)

WITH me, creation, starORDER BY star.createdAtWITH me, creation, HEAD(COLLECT(star)) AS star

MATCH (creation) -[:creator]-> (creator)WHERE NOT (me) -[:follows*0..1]-> (creator)

WHERE star.createdAt < {cursorTime}RETURN creation, star.createdAt AS _starredAtORDER BY _starredAt DESCLIMIT {count}

Page 50: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

DEDUPING (BAD)MATCH (me:User {id: {id}})MATCH (me) -[:follows]-> (f) -[star:starred]-> (creation)

WITH me, creation, starORDER BY star.createdAtWITH me, creation, HEAD(COLLECT(star)) AS star

MATCH (creation) -[:creator]-> (creator)WHERE creator <> me AND NOT((me) -[:follows]-> (creator))

WHERE star.createdAt < {cursorTime}RETURN creation, star.createdAt AS _starredAtORDER BY _starredAt DESCLIMIT {count}

Page 51: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

QUERY PROFILINGfor key, query of queries echo "Query '#{key}':"

# warm-up: neo4j.query query, params, _

times = [] for i in [1..3] start = Date.now() neo4j.query query, params, _ times.push Date.now() - start

# ... echo "Min/median/max: #{min}/#{median}/#{max} ms. Mean: #{Math.round mean} ms."

(Hat-tip Mark Needham)

Page 52: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

HOME STREAM0-following-ids 27 ms1-following-shares 581 ms2-following-features 77 ms3-following-stars 1386 ms4-stars-remixes 189 ms5-shares-remixes 81 ms

All in parallel 1961 ms

(On my aging MacBook Air, for our ~worst-case user.)

Page 53: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

IN PRODUCTION…

(But still some || mystery to unravel…)

Page 54: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

THRESHOLD

Page 55: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 56: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

THRESHOLDMATCH (me:User {id: {id}})

WITH me, TOFLOAT(CASE WHEN me.numFollowing < 1 THEN 1 ELSE me.numFollowing END) AS ̀me.numFollowing̀WITH me, FLOOR(LOG(3 * ̀me.numFollowing̀ / 100) / LOG(3)) AS thresholdWITH me, (CASE WHEN threshold < 0 THEN 0 ELSE TOINT(threshold) END) + 1 AS threshold

MATCH (me) -[:follows]-> (following) -[star:starred]-> (creation)

WITH creation, star, thresholdORDER BY star.createdAtWITH creation, COLLECT(star) AS stars, thresholdWHERE LENGTH(stars) >= thresholdWITH creation, stars[threshold - 1] AS star

WITH creation, star.createdAt AS _starredAtORDER BY _starredAt DESCLIMIT {count}

MATCH (creation) -[:creator]-> (creator)RETURN creation, creator, _starredAt

Page 57: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 58: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 59: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 60: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 61: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 62: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2
Page 63: GraphConnect 2014 SF: Betting the Company on a Graph Database - Part 2

THANK YOU