Um sistema de recomendação de
produtos baseado em grafos
Renato Pedigoni!
Engenheiro Líder
@rpedigoni
André Fatala!
Diretor P&D
@andrefatala
744 lojas físicas
8 centros de distribuição
+24 mil colaboradores
+22 milhões de clientes
"Big data is like teenage sex: everyone talks
about it, nobody really knows how to do it,
everyone thinks everyone else is doing it, so
Grafos
Vértices
(entidades, objetos)
Grafos
Vértices
(entidades, objetos)
Arestas
Grafos
Vértices
(entidades, objetos)
Arestas
(relacionamentos, conexões)
pertence
Pessoa Sessão Produto Categoria Depto
Grafos
Vértices
(entidades, objetos)
Arestas
(relacionamentos, conexões)
pertence
Pessoa Sessão Produto Categoria Depto
visitou
comprou
avaliou
nome email
timestamp titulo estoque
Modelo: e-commerce
Modelo: e-commerce
Pessoa
Modelo: e-commerce
Pessoa Sessão
Modelo: e-commerce
Pessoa Sessão
iniciou
Modelo: e-commerce
Pessoa Sessão
iniciou
Modelo: e-commerce
Pessoa Sessão Produto iniciou visitou pertenceModelo: e-commerce
Pessoa Sessão Categoria
iniciou
visitou
Modelo: e-commerce
Pessoa Sessão Categoria
Produto
iniciou
visitou
pertence
Modelo: e-commerce
Pessoa Sessão Categoria
Depto
iniciou
visitou
pertence
Modelo: e-commerce
Pessoa Sessão Categoria
Depto Produto iniciou visitou crosssell pertence pertence
Modelo: e-commerce
Pessoa Sessão Categoria
Depto Produto iniciou visitou crosssell pertence pertence
Modelo: e-commerce
Pessoa Sessão Categoria
Depto Produto Produto iniciou visitou crosssell pertence pertence upsell
Modelo: e-commerce
Pessoa Sessão Categoria
Depto Produto iniciou visitou crosssell pertence pertence upsell
Modelo: e-commerce
Pessoa Sessão Categoria
Depto Produto Produto Produto iniciou visitou similar crosssell pertence pertence upsell
Modelo: e-commerce
Pessoa Sessão Produto Categoria Depto Produto iniciou visitou similar crosssell pertence pertence upsellTinkerpop
Java
Conjunto de ferramentas para trabalhar
com grafos
Grafos persistentes
Grafos persistentes
Suporta grandes grafos
Código aberto, uso gratuito (incl. comercial)
Storage configurável: Cassandra, HBase, entre
outros
Nossa escolha:
Grafos persistentes
•
Teorema "CAP"
Grafos persistentes
•
Teorema "CAP"
Consistência - Disponibilidade - Particionamento
Nossa escolha
- Sem ponto único de falha
- Consistência eventual
Como interagir com o grafo?
?
?
Como interagir com o grafo?
Gremlin:
Parte do Tinkerpop
DSL para grafos
Simples
Comunidade ativa
Exemplo
> vert1 = g.addVertex();
>
vert1
.tipo =
'visitante'
;
Exemplo
> vert1 = g.addVertex();
>
vert1
.tipo =
'visitante'
;
> vert2 = g.addVertex();
>
vert2.tipo =
'produto'
;
Exemplo
> vert1 = g.addVertex();
>
vert1
.tipo =
'visitante'
;
> vert2 = g.addVertex();
>
vert2.tipo =
'produto'
;
> g.addEdge(vert1, vert2,
'visitou'
);
> g.commit()
Visitante
visitou
Quem viu, também viu
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD
Recomendação
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189
visitou
visitou
visitou
TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"visitou
visitou
visitou
visitou
visitou
visitou
Recomendação
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD
Recomendação
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
Recomendação
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
Recomendação
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
.
in
(
'visitou'
)
Recomendação
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
.
in
(
'visitou'
)
Recomendação
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
.
in
(
'visitou'
)
Recomendação
.
out
(
'visitou'
)
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
.
in
(
'visitou'
)
Recomendação
.
out
(
'visitou'
)
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
.
in
(
'visitou'
)
Recomendação
.
out
(
'visitou'
)
.
groupCount
()
key
value
TV LCD 40"
TV PLASMA 52"
TV LED 42”
TV LCD 32"
1
2
3
1
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
.
in
(
'visitou'
)
Recomendação
.
out
(
'visitou'
)
key
value
TV LCD 40"
TV PLASMA 52"
TV LED 42”
TV LCD 32"
1
2
3
1
Sessão! #21162
Quem viu, também viu
TV LED 40" Sessão! #826482 Sessão! #4337189 TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32"
g.V(
'product_sku'
,
'tv_led_40'
)
.
in
(
'visitou'
)
Recomendação
.
out
(
'visitou'
)
.
groupCount
()
key
value
TV LCD 40"
TV PLASMA 52"
TV LED 42”
TV LCD 32"
1
2
3
1
.
sort
{-it.value}
Produto
Supernodes
•
Vértices com número desproporcional de arestas
conectadas
Produto
Supernodes
•
Vértices com número desproporcional de arestas
conectadas
Produto
+1.000.000
http://thinkaurelius.com/2012/10/25/a-solution-to-the-supernode-problem/ Benchmark
Produto
Supernodes
•
Vértices com número desproporcional de arestas
conectadas
Produto
Solução (Titan): vertex-centric indices
+1.000.000
Arestas de atalho
TV LED 40" TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32" Sessão" #21162 Sessão" #826482 Sessão" #4337189visitou
visitou
visitou
visitou
visitou
visitou
visitou
visitou
visitou
1
Arestas de atalho
TV LED 40" TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD Sessão" #21162 Sessão" #826482 Sessão" #4337189visitou
visitou
visitou
visitou
visitou
visitou
visitou
visitou
visitou
1
Arestas de atalho
TV LED 40" TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32" Sessão" #21162 Sessão" #826482 Sessão" #4337189visitou
visitou
visitou
visitou
visitou
visitou
visitou
visitou
visitou
1
quem_viu_tb_viu
quem_viu_tb_viu
Arestas de atalho
TV LED 40" TV LCD 40" TV PLASMA 52" TV LED 42” TV LCD 32" Sessão" #21162 Sessão" #826482 Sessão" #4337189visitou
visitou
visitou
visitou
visitou
visitou
visitou
visitou
visitou
1
quem_viu_tb_viu
quem_viu_tb_viu
Faunus
Roda sobre o Hadoop, armazena os dados no HDFS
Ferramenta para operações globais no grafo
Diversas utilidades
Graph analytics
Schema migration
Sub grafos
Faunus: exemplo
In degree distribution
Faunus: exemplo
In degree distribution
Faunus: exemplo
In degree distribution
Faunus: exemplo
In degree distribution
g.V
.sideEffect(
'{it.degree=it.inE.count()}'
).degree.
groupCount
==>1 167050!
==>10 2305!
==>100 6!
==>108 3!
==>119 3!
==>122 3!
==>133 1!
==>144 2!
==>155 1!
==>166 2!
==>18 471!
==>188 1!
==>21 306!
==>232 1!
==>254 1!
Rexster
•
Parte da stack Tinkerpop
•
Permite acessar qualquer grafo Blueprints através
de uma API REST
User
type
userId
User
type
Gremlin Demo
User
type
userId
Gremlin Demo
initialized Sessiontype
sessionId
timestamp
User
type
userId
Gremlin Demo
initialized Sessiontype
sessionId
viewedUser