Neo4j Jízdomat
-
Upload
jan-mittner -
Category
Technology
-
view
398 -
download
1
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?