SlideShare ist ein Scribd-Unternehmen logo
1 von 17
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?

Weitere ähnliche Inhalte

Andere mochten auch

Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Péhápkaři
 
Av technika 13
Av technika 13Av technika 13
Av technika 13olc_user
 
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...Jakub Kulhan
 
VIM - nejefektivnější editor na světě
VIM - nejefektivnější editor na světěVIM - nejefektivnější editor na světě
VIM - nejefektivnější editor na světěClevis s.r.o.
 
What makes a good developer from a management perspective
What makes a good developer from a management perspectiveWhat makes a good developer from a management perspective
What makes a good developer from a management perspectiveBrnoPHP
 
Čtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkČtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkMartin Zeman
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Péhápkaři
 
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clusterJakub Kulhan
 
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě
 
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconVojta Svoboda
 
Real-time Web a NodeJS
Real-time Web a NodeJSReal-time Web a NodeJS
Real-time Web a NodeJSJakub Nesetril
 
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowJakub Nesetril
 
Data Modeling with Neo4j
Data Modeling with Neo4jData Modeling with Neo4j
Data Modeling with Neo4jNeo4j
 
FTP deployment Devel 2015
FTP deployment Devel 2015FTP deployment Devel 2015
FTP deployment Devel 2015David Grudl
 
Nette: jak rozbít atom?
Nette: jak rozbít atom?Nette: jak rozbít atom?
Nette: jak rozbít atom?David Grudl
 

Andere mochten auch (16)

Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
 
Av technika 13
Av technika 13Av technika 13
Av technika 13
 
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
 
VIM - nejefektivnější editor na světě
VIM - nejefektivnější editor na světěVIM - nejefektivnější editor na světě
VIM - nejefektivnější editor na světě
 
What makes a good developer from a management perspective
What makes a good developer from a management perspectiveWhat makes a good developer from a management perspective
What makes a good developer from a management perspective
 
Čtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkČtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php framework
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
 
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
 
Asynchronně v PHP
Asynchronně v PHPAsynchronně v PHP
Asynchronně v PHP
 
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
 
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs Phalcon
 
Real-time Web a NodeJS
Real-time Web a NodeJSReal-time Web a NodeJS
Real-time Web a NodeJS
 
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflow
 
Data Modeling with Neo4j
Data Modeling with Neo4jData Modeling with Neo4j
Data Modeling with Neo4j
 
FTP deployment Devel 2015
FTP deployment Devel 2015FTP deployment Devel 2015
FTP deployment Devel 2015
 
Nette: jak rozbít atom?
Nette: jak rozbít atom?Nette: jak rozbít atom?
Nette: jak rozbít atom?
 

Neo4j Jízdomat

  • 2. Kdo jsme a co děláme?
  • 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
  • 4.
  • 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 to vyřešili?
  • 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
  • 11.
  • 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?