Neo4j Jízdomat

Post on 11-Jul-2015

398 views 1 download

Transcript of Neo4j Jízdomat

Jan Mittner

Neo4j na JízdomatuNeo4j na Jízdomatu

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

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

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

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?

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

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

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

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

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

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);

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)

Několik číselNěkolik čísel

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?

Děkuji za pozornostDěkuji za pozornost

VaVaše dotazy?še dotazy?