Neo4j na Jízdomatu
Jan Mittner
Kdo jsme a co děláme?
Jí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?
Dů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?
Sociá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



počítali jsme dávkově přes joiny v MySQL
 vydrželo



pár tisíc uživatelů

pár desítek tisíc uživatelů

nakonec jsme přestali počítat 
Sociá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í
Graf






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 neo4j


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



Cypher
START from=node:node_auto_index(user_id="{FROM}"),
to=node:node_auto_index("user_id:({TO})")
MATCH p = from-[r*1..{MAX_LENGTH}]->to
RETURN 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 čísel
Statistiky


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 pozornost

Vaše dotazy?

Neo4j Jízdomat

  • 1.
  • 2.
    Kdo jsme aco děláme?
  • 3.
    Jízdomat  webová aplikace prospolují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
  • 5.
  • 6.
    Dů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?
  • 7.
    Jak jsme tovyřešili?
  • 8.
    Sociální vazby meziuž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  počítali jsme dávkově přes joiny v MySQL  vydrželo  pár tisíc uživatelů pár desítek tisíc uživatelů nakonec jsme přestali počítat 
  • 9.
    Sociální vazby meziuž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
  • 10.
    Use case   můžu siu ř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
  • 12.
  • 13.
    Graf    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);
  • 14.
    Dotazy v neo4j  potřebujemecesty přes nejméně hran seřazené dle celkové vzdálenosti  Cypher START from=node:node_auto_index(user_id="{FROM}"), to=node:node_auto_index("user_id:({TO})") MATCH p = from-[r*1..{MAX_LENGTH}]->to RETURN 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)
  • 15.
  • 16.
    Statistiky  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?
  • 17.