3. 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
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?
8. 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
9. 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
10. 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
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ř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)
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?