Neo4j Jízdomat

17
Jan Mittner Neo4j na Jízdomatu Neo4j na Jízdomatu

Transcript of Neo4j Jízdomat

Page 1: Neo4j Jízdomat

Jan Mittner

Neo4j na JízdomatuNeo4j na Jízdomatu

Page 2: Neo4j Jízdomat

Kdo jsme a co dKdo jsme a co děláme?ěláme?

Page 3: Neo4j Jízdomat

JízdomatJízdomat

webová aplikace pro spolujízdu autem řidič nabídne místo v autě na určené trase cestující se na jízdu přihlásí, zaplatí poměrnou

část nákladů a sveze se

kam jsme se dostali 70 tisíc registrovaných uživatelů 4 tisíce jízd týdně

190 tisíc vypsaných jízd celkem

Page 4: Neo4j Jízdomat
Page 5: Neo4j Jízdomat

Jaký problém jsme řešili?Jaký problém jsme řešili?

Page 6: Neo4j Jízdomat

Důvěra mezi uživateliDůvěra mezi uživateli

klíčový faktor úspěchu: důvěra mezi řidičem a cestujícím

jak ji podpořit? hodnocení uživatelů

celkem 87 tisíc hodnocení; 98,5 % pozitivní ověření telefonu, e-mailu a adresy

mojeID sociální vazby mezi uživateli

jak ale na to?

Page 7: Neo4j Jízdomat

Jak jsme to vyřešili?Jak jsme to vyřešili?

Page 8: Neo4j Jízdomat

Sociální vazby mezi uživateliSociální vazby mezi uživateli

facebooková přátelství „řidiče Frantu můžete znát přes kamaráda Pepu“

počítali jsme dávkově přes dijkstru v PHP vydrželo pár tisíc uživatelů

počítali jsme dávkově přes joiny v MySQL vydrželo pár desítek tisíc uživatelů

nakonec jsme přestali počítat

Page 9: Neo4j Jízdomat

Sociální vazby mezi uživateliSociální vazby mezi uživateli

upgrade: veškeré vazby mezi uživateli kdo se s kým kamarádí na FB kdo koho svezl v autě kdo se s kým zároveň vezl v autě

vazby mají různou intenzitu typ vazby: přátelství vs. dva náhodní spolucestující četnost: pravidelní vs. náhodní cestující čas poslední interakce mezi uživateli hodnocení mezi uživateli (palec nahoru a dolů)

=> funkce, která určí intenzitu vazby== vzdálenost mezi dvěma uživateli

Page 10: Neo4j Jízdomat

Use case

můžu si u řidiče / cestujícího kliknout na odkaz Znáte se?

spočítá to nejkratší cestu k tomuto uživateli nejkratší ve smyslu co nejintenzivnějších vazeb

pokud max 2 mezičlánky, pořád slušná vypovídací hodnota znám někoho, komu můžu říct, aby se zeptal jeho

známého, jak byl s daným uživatelem spokojen

Page 11: Neo4j Jízdomat
Page 12: Neo4j Jízdomat

Technické řešeníTechnické řešení

Page 13: Neo4j Jízdomat

GrafGraf

uzly = uživatelé cca 70 tisíc uzlů

hrany = sociální vazby mezi uživateli cca 480 tisíc hran

grafová databáze neo4j export produkční databáze do GraphML

<graph><node id=“1”/><edge source=“1” … dávkový import do neo4j skrz Gremlin g.clear();g.loadGraphML(URL);

Page 14: Neo4j Jízdomat

Dotazy v neo4jDotazy v neo4j

potřebujeme cesty přes nejméně hran seřazené dle celkové vzdálenosti

CypherSTART from=node:node_auto_index(user_id="{FROM}"),to=node:node_auto_index("user_id:({TO})")MATCH p = from-[r*1..{MAX_LENGTH}]->toRETURN extract(n in nodes(p) : n.user_id), extract(rel in

relationships(p) : rel.cost), extract(rel in relationships(p) : type(rel)) ORDER BY length(p), reduce(totalCost = 0, rel in relationships(p) : totalCost + rel.cost) LIMIT 3

bohužel velmi pomalé (řádově sekundy)

plugin do neo4j od Michala Bachmana velmi rychlé (10-20 ms)

Page 15: Neo4j Jízdomat

Několik číselNěkolik čísel

Page 16: Neo4j Jízdomat

StatistikyStatistiky

70 tisíc uzlů (uživatelů)

40 tisíc uzlů má hranu k jinému uzlu

já: 196 uživatelů přes 1 hranu 2740 uživatelů přes 2 a méně hran 20247 uživatelů přes 3 a méně hran dál už mi to nespočítalo

nechtěl by si někdo pohrát se získáním statistik?

Page 17: Neo4j Jízdomat

Děkuji za pozornostDěkuji za pozornost

VaVaše dotazy?še dotazy?