SlideShare a Scribd company logo
I Graph Database: analisi del comportamento degli utenti
Modeling user
Behavior Trough
Graph Database
ThinkOpen – 13 Giugno 2019
Roberto Grandi
#TOPWorkshop
Graph Databases
00
01
02
03
04
05
a cura di Roberto Grandi
Intro
Data Models
Graph Databases
Demo
Conclusioni
Risorse
My Background
SW e Analytics
Backend SW: Data Oriented microservices
Analytics: Data Engineering e Data Analysis
Ambito
Servizi ecommerce & Marketplace
Energy
Healthcare
Interests & Goals
User Behaviour Analysis
• Cosa fanno sul sito/app (eg: ricerche)
• Quali contenuti proporgli (suggestions)
• Engagement + Re-Engagement
Product & Content Improvement
• Per soddisfare i clienti attuali: utenti e venditori
• Per attrarre nuovi clienti
Ingredienti
.4 linguaggi di sviluppo (c#, python, java, scala)
.3 databases (elasticsearch, postgresql, Big query, graphdb)
.3-4 tools a piacimento (google o adobe analytics, google adwords, bing)
Un pizzico di Jenkins, Azure e Google Cloud Platform
Amalgamare e cuocere a “fuoco lento” per alcuni ….minuti .. mesi
Data Models
Retail Behavior - Offline
• Conosco un set di operazioni/transazioni
• Ordini
• Offerte commerciali
• Promo
• Utente: conosco i suoi attributi/anagrafica (quando sono fortunato)
• Cliente “particolari”
• Clienti offline: bassa “frequentazione”
• Business: molto (molto) bassa “frequentazione”
Web Behavior
• Conosco un set di operazioni/transazioni
• Acquisti
• Richieste di supporto
• Utente: anagrafica (molto) ristretta
• Esempio: form di iscrizione snello VS form iscrizione “tabellare”
• Utente Anonimo: web = cookies + GDPR
• Conosco tutte le azioni sul sito
• Visualizzazione Dettaglio Prodotto
• Aggiunta Carrello
• Acquisto
• Review Prodotto
App Behavior
• Conosco un set di operazioni/transazioni
• Acquisti
• Richieste di supporto
• Utente: anagrafica ristretta
• Utente Anonimo ma meglio definito: deviceId
• Conosco tutte le azioni App*
• ScreenView
• Location
• Contenuti: immagini, audio
* bonus: non ho javascript tra le scatole, deviceId meno volatile dei cookies
Big Data (?) e Modelli
• Tanti dati?
• Meglio tanti “esempi”, che mi permettano di rappresentare il problema
• Colleziono tutto?
• Mi concentro su un problema alla volta
• NB: Speculare può portare fortuna
• Come li gestisco o come li uso?
• Indago su un obiettivo principale, esploro un obiettivo secondario
La sfida
• Modellizzare le relazioni tra utenti per capire come si comportano, in
maniera più intuitiva.
• Sia in fase di analisi
• Sia per costruire sistemi in grado di fornire informazioni “live”
• Esempio: suggerire qualcosa ad un utente nuovo o esistente.
Graph
Databases
Graph
Struttura dati basata su
• Nodi (Vertex)
• Archi (Edge)
Roberto Fiat 500
Microsoft
Property Graph
• Labels
• Key/Value Properties
Roberto Fiat 500
Microsoft
PERSON
COMPANY
CAR
Age: 39
Work: SW Dev
Name: Microsoft
Business: Software
Hp: 50
Brand: Fiat
Works With
since:2006
Owns
since:2010
Graph DB - Panorama
OLAP OLTP
GraphDB - Caratteristiche
• Gestiscono relazioni “entity to entity” (no tabelle N-M)
• Alta velocità di attraversamento nodo – relazione – nodo – … – nodo
• Algoritmi ad-hoc (Page Rank, Shortest Path, …)
• Alcuni (>100 !!!) esempi
GraphDB: Use cases e algoritmi
• Social Analytics
• User Behavior (Recommendation Engine)
• Fraud Analysis (Fraud Rings)
• Logistics
• Access Control (Hierarchies of Access Rules)
• Gaming (game blocks)
Neo4j - Cypher
Graph Query Language (Pattern matching)
MATCH (a:USER) –[:LIKES]-> (b:MOVIE)
WHERE a.name = “Rob”
RETURN b.id, b.title;
Ref: https://neo4j.com/developer/cypher-query-language/
DEMO
RDBMS vs GRAPH DB
• Analisi di un database “classico”
• Nortwhind
• Azure Data Studio + SQL Server
+ Docker
• Neo4J Desktop
• Obiettivo:
• Esplorazione
• Trovare I prodotti più venduti
• Capire chi sono gli utenti
coinvolti
• Offriamo qualcosa di diverso a
“questi” utenti
Demo - Northwind
Product
Employee
Category
Order
Supplier
Customer
SOLD
PRODUCT
PURCHASED
SUPPLIES
PART_OF
REPORTS_TO
The Relational Way (.. inizio ..)
WITH
-- tutti gli ordini in cui ho comprato il prodotto 60
qry1 AS (
SELECT OD."OrderID", O."CustomerID", "ProductID", "UnitPrice", "Quantity",
"Discount"
FROM public.order_details as OD INNER JOIN public.orders as O ON OD."OrderID"
= O."OrderID"
WHERE OD."ProductID" = 60
)
.. .. .. ..
The Relational Way (.. seconda parte ..)
-- tutti i prodotti diversi da X venduti assieme ad 60
, qry2 AS (
SELECT
OD."ProductID", COUNT(*) AS N
FROM qry1
INNER JOIN public.orders as O ON O."OrderID" = qry1."OrderID"
INNER JOIN public.order_details as OD ON OD."OrderID" = O."OrderID"
WHERE OD."ProductID" <> 60
GROUP BY OD."ProductID"
)
SELECT * FROM qry2 ORDER BY N desc
The Graph Way
MATCH
(p:Product)<-[pu:PRODUCT]-(o:Order)<-[purch:PURCHASED]-
(c:Customer)
, (p2:Product)<-[pu2:PRODUCT]-(o2:Order)<-[purch2:PURCHASED]-(c)
WHERE p.productID = "60" AND p.productID <> p2.productID
RETURN p2.productID, p2.productName, COUNT(*) as times
ORDER BY times DESC
GraphDB ?
Rivediamo i Contesti precedenti….
……… Da un punto di vista diverso
Retail
ProductEmployee
Category
Order
Supplier
Customer
SOLD
PRODUCT
PURCHASED
SUPPLIES
PART_OFREPORTS_TO
MEMBER_OF
BOUGHT
Web
Product
Category
Cookie
ASSOCIATED
VIEW
- timestamp
PART_OF
MEMBER_OF
E-Mail
ADD TO CART
- timestamp
- quantity
BOUGHT
- timestamp
- quantity
Session
Traffic
Source
GENERATE
CONTAINED
Mobile App
Product
Category
Device
ASSOCIATED
VIEW
- Timestamp
- Location
- Content
PART_OF
MEMBER_OF
E-Mail
ADD TO CART
- timestamp
- quantity
BOUGHT
- timestamp
- quantity
Session
Traffic
Source
GENERATE
Content
PUBLISH
CONTAINED
Recommendation
Engine
Recommendation Engines
• Content Based
• Individuare un set di caratteristiche/contenuti in commune tra utenti
• Collaborative Filtering
• Individuare un usi/comportamenti comuni tra utenti
• Hybrid
• Mix tra content e collaborative filtering
Content Based
GOAL: identificare item simili utilizzando attributi o caratteristiche di un
prodotto di partenza
Esempio: Homer adora birra “Duff” -> Potrebbe interessargli la T-Shirt “Duff”
Collaborative Filtering
GOAL: suggerire un item sulla base dei comportamenti associati a quell’item da parte
dei relative utenti
Esempio: Utente A e B condividono comportamenti in commune (pizza e pasta) =>
potrei suggerire a A quello che piace a B (che A non conosce)
Esempi
• Have a look http://rejoiner.com/resources/amazon-recommendations-
secret-selling-online/
Alternating Least Squares
• Collaborative Filtering Algorithm
• Apache Spark
• Real Time… ?
Demo
Movie Lens Recommendations
MovieLens Recommender
• Ingredienti
• Movielens 100K dataset
• Neo4J (Desktop)
• Chyper
• Obiettivo
• Costruire in modo incrementale un semplice recommendation engine
MovieLens Recommender
• Data Load
• Content Based Recommendation
• Collaborative Filtering Recommendations
• Simple
• Advanced
MovieLens Data Model
MovieLens - Jaccard Similarity
• Movie A VS Movie B
• Genres(A) = {“Drama”, “Adult”}
• Genres(B) = {“Drama”, “Sci-Fi”, “Horror”}
• J(A,B) = LEN({“Drama”}) / LEN({“Drama”, “Sci-Fi”, “Horror”, “Adult”})
= 1/4
Ref: Neo4j Jaccard SImilarity
MovieLens – Collaborative Filtering
Roberto
Matrix
Sarah
Rambo
Avengers
EndGame
?
MovieLens – Euclidean Distance
• User a VS User b
• Ratings(a) = { ra1, ra2, … raN }
• Ratings(b) = { rb1, rb2, … rbN }
• D(a,b) = SQRT( (rb1-ra1)^2 + ….. (rbN-raN)^2 )
• S(a,b) = 1/ 1 + D(a,b)
Ref: Neo4j Euclidean SImilarity
Euclidean Similarity – Neo4J
MATCH (u1:USER{ userId: 1 })-[r1:RATED]->(m:MOVIE)<-[r2:RATED]-(u2:USER)
WITH
count(m) AS CommonMovies, u1.userId AS user1, u2.userId AS user2, u1, u2
, collect((toFloat(r1.rating)-toFloat(r2.rating))^2) AS ratings, collect(m.title) AS
movieNames, collect(m.movieId) AS movieIds
WITH u1, u2, CommonMovies, movieNames, movieIds, ratings
WHERE CommonMovies > 2
WITH u1, u2, CommonMovies, 1/(1+SQRT(reduce(total=0.0, k in extract(i in ratings | i ) |
total+k))) as EUC_SIM
ORDER BY EUC_SIM DESC LIMIT 3
MATCH (u2)-[or:RATED]->(om:MOVIE) WHERE NOT ( (u1)-[:RATED]->(om) )
WITH om , EUC_SIM as similarity, or.rating as rating
ORDER BY om.movieId, similarity DESC
MovieLens – Cosine Similarity
• User a VS User b
• Ratings(a) = { ra1, ra2, … raN }
• Ratings(b) = { rb1, rb2, … rbN }
• S(a,b) = [ (rb1*ra1) + ..+ (rbN*raN) ] / [ SQRT(ra1^2+…+raN^2) *
SQRT( rb1^2 + ….. + rbN^2 )
Ref: Neo4j Cosine Similarty
Cosine Similarity - Neo4J
MATCH (u1:USER{ userId:1 })-[x:RATED]->(m:MOVIE)<-[y:RATED]-(u2:USER)
WITH
u1, u2, COUNT(m) as CommonMovies, COLLECT(m) as CommonMoviesItems
, SUM(toFloat(x.rating) * toFloat(y.rating)) AS xyDotProduct
, SQRT(REDUCE(xDot = 0.0, a IN COLLECT(toFloat(x.rating)) | xDot + toFloat(a)^2)) AS xProd
, SQRT(REDUCE(yDot = 0.0, b IN COLLECT(toFloat(y.rating)) | yDot + toFloat(b)^2)) AS yProd
WHERE CommonMovies > 2
WITH u1, u2, CommonMovies, CommonMoviesItems, (xyDotProduct / (xProd * yProd)) as CosineSimilarity
ORDER BY CosineSimilarity DESC LIMIT 5
MATCH (u2)-[or:RATED]->(om:MOVIE)
WHERE NOT ( (u1)-[:RATED]->(om) )
WITH u2, om , CosineSimilarity, or.rating as rating
ORDER BY om.movieId, CosineSimilarity DESC
MovieLens – Pearson Similarity
• Misura della correlazione lineare
tra A e B
• Assume valori tra -1 e 1
Ref: Neo4j Person Similarty
Demo
Instacart User Behavior
Instacart Kaggle - Dataset
• Website
• 3M orders
• 200K Users
Instacart Kaggle – Alternative Data Model
Calcolo Probabilità
• di acquistare C dopo aver acquistato B -> P(C|B)
• acquistare C dopo aver acquistato B e A -> P(C|A,B)
Product A Product B
:NEXT
- times: 100
Product C
:NEXT
- times: 30
Product D:NEXT
- times: 50
Instacart Kaggle - Recommendation
MATCH
(p:Product{ name = “Chocolate Sandwich Cookies” }) –[r:NEXT] -
>(next:Product)
RETURN next.name, r.count
Gremlin
(and the others)
Apache TinkerPop
Graph Computing Framework: Storage + Processor
Ref: http://tinkerpop.apache.org/
Gremlin Language
Graph Traversal Language
g
.V(“Roberto”)
.out(“knows”)
.out(“knows”)
.value(“name”)
Gremlin Console (REPL)
Gremlin Server Example
Application JanusGraph
Gremlin Server
Backend Cluster
(data + index)
OrientDB
Master
Slave/Shard
1
Master
Slave/Shard
2
Slave/Shard
3
Embedded
Slave/Shard 1
Embedded
Slave/Shard 2…………
Embedded
Slave/Shard 3
…………
Ref: www.orientdb.com
Ref: www.hazelcast.com
Hazelcast
Conclusioni
Conclusioni
• GraphDB offrono una prospettiva “diversa”
• Join molto complesse
• CTE e operazioni ricorsive
• Relazioni tra archi e nodi sono di naturale interpretazione
• Attenzione (!)
• Versioni Enterprise costano parecchio
• Tanti nuovi player -> competizione
• Alternativa Cloud -> Amazon Neptune, Azure CosmosDB
Conclusioni
• Studio
• Diversi libri in questo ambito
• Diversi Databases e Tool
• Spike
• Caricate I dati su un GraphDB
• Gestionale, Crm, Dati non strutturati
• Suggerimenti
• In Locale e sul Cloud
Conclusioni
Next Steps?
• Cloud
• Hadoop (HBase + Janus + Spark)
• Machine Learning
Risorse
• MovieLens Datasets
• Neo4J Books
Risorse
Recommendation Systems Ebooks
Grazie!
{
“id”: 99
, “name”: “Roberto Grandi”
, “mail”: roberto.grandi@gmail.com
, “twitter”: @grandirob
, “contact me for”: [“help”, “consultancy”, “SW”]
, “interests”: [ “SW Development”,
“Data Engineering”,
“User Behavior” ]
}

More Related Content

I Graph Database: analisi del comportamento degli utenti

  • 2. Modeling user Behavior Trough Graph Database ThinkOpen – 13 Giugno 2019 Roberto Grandi
  • 3. #TOPWorkshop Graph Databases 00 01 02 03 04 05 a cura di Roberto Grandi Intro Data Models Graph Databases Demo Conclusioni Risorse
  • 4. My Background SW e Analytics Backend SW: Data Oriented microservices Analytics: Data Engineering e Data Analysis Ambito Servizi ecommerce & Marketplace Energy Healthcare
  • 5. Interests & Goals User Behaviour Analysis • Cosa fanno sul sito/app (eg: ricerche) • Quali contenuti proporgli (suggestions) • Engagement + Re-Engagement Product & Content Improvement • Per soddisfare i clienti attuali: utenti e venditori • Per attrarre nuovi clienti
  • 6. Ingredienti .4 linguaggi di sviluppo (c#, python, java, scala) .3 databases (elasticsearch, postgresql, Big query, graphdb) .3-4 tools a piacimento (google o adobe analytics, google adwords, bing) Un pizzico di Jenkins, Azure e Google Cloud Platform Amalgamare e cuocere a “fuoco lento” per alcuni ….minuti .. mesi
  • 8. Retail Behavior - Offline • Conosco un set di operazioni/transazioni • Ordini • Offerte commerciali • Promo • Utente: conosco i suoi attributi/anagrafica (quando sono fortunato) • Cliente “particolari” • Clienti offline: bassa “frequentazione” • Business: molto (molto) bassa “frequentazione”
  • 9. Web Behavior • Conosco un set di operazioni/transazioni • Acquisti • Richieste di supporto • Utente: anagrafica (molto) ristretta • Esempio: form di iscrizione snello VS form iscrizione “tabellare” • Utente Anonimo: web = cookies + GDPR • Conosco tutte le azioni sul sito • Visualizzazione Dettaglio Prodotto • Aggiunta Carrello • Acquisto • Review Prodotto
  • 10. App Behavior • Conosco un set di operazioni/transazioni • Acquisti • Richieste di supporto • Utente: anagrafica ristretta • Utente Anonimo ma meglio definito: deviceId • Conosco tutte le azioni App* • ScreenView • Location • Contenuti: immagini, audio * bonus: non ho javascript tra le scatole, deviceId meno volatile dei cookies
  • 11. Big Data (?) e Modelli • Tanti dati? • Meglio tanti “esempi”, che mi permettano di rappresentare il problema • Colleziono tutto? • Mi concentro su un problema alla volta • NB: Speculare può portare fortuna • Come li gestisco o come li uso? • Indago su un obiettivo principale, esploro un obiettivo secondario
  • 12. La sfida • Modellizzare le relazioni tra utenti per capire come si comportano, in maniera più intuitiva. • Sia in fase di analisi • Sia per costruire sistemi in grado di fornire informazioni “live” • Esempio: suggerire qualcosa ad un utente nuovo o esistente.
  • 14. Graph Struttura dati basata su • Nodi (Vertex) • Archi (Edge) Roberto Fiat 500 Microsoft
  • 15. Property Graph • Labels • Key/Value Properties Roberto Fiat 500 Microsoft PERSON COMPANY CAR Age: 39 Work: SW Dev Name: Microsoft Business: Software Hp: 50 Brand: Fiat Works With since:2006 Owns since:2010
  • 16. Graph DB - Panorama OLAP OLTP
  • 17. GraphDB - Caratteristiche • Gestiscono relazioni “entity to entity” (no tabelle N-M) • Alta velocità di attraversamento nodo – relazione – nodo – … – nodo • Algoritmi ad-hoc (Page Rank, Shortest Path, …) • Alcuni (>100 !!!) esempi
  • 18. GraphDB: Use cases e algoritmi • Social Analytics • User Behavior (Recommendation Engine) • Fraud Analysis (Fraud Rings) • Logistics • Access Control (Hierarchies of Access Rules) • Gaming (game blocks)
  • 19. Neo4j - Cypher Graph Query Language (Pattern matching) MATCH (a:USER) –[:LIKES]-> (b:MOVIE) WHERE a.name = “Rob” RETURN b.id, b.title; Ref: https://neo4j.com/developer/cypher-query-language/
  • 20. DEMO RDBMS vs GRAPH DB • Analisi di un database “classico” • Nortwhind • Azure Data Studio + SQL Server + Docker • Neo4J Desktop • Obiettivo: • Esplorazione • Trovare I prodotti più venduti • Capire chi sono gli utenti coinvolti • Offriamo qualcosa di diverso a “questi” utenti
  • 22. The Relational Way (.. inizio ..) WITH -- tutti gli ordini in cui ho comprato il prodotto 60 qry1 AS ( SELECT OD."OrderID", O."CustomerID", "ProductID", "UnitPrice", "Quantity", "Discount" FROM public.order_details as OD INNER JOIN public.orders as O ON OD."OrderID" = O."OrderID" WHERE OD."ProductID" = 60 ) .. .. .. ..
  • 23. The Relational Way (.. seconda parte ..) -- tutti i prodotti diversi da X venduti assieme ad 60 , qry2 AS ( SELECT OD."ProductID", COUNT(*) AS N FROM qry1 INNER JOIN public.orders as O ON O."OrderID" = qry1."OrderID" INNER JOIN public.order_details as OD ON OD."OrderID" = O."OrderID" WHERE OD."ProductID" <> 60 GROUP BY OD."ProductID" ) SELECT * FROM qry2 ORDER BY N desc
  • 24. The Graph Way MATCH (p:Product)<-[pu:PRODUCT]-(o:Order)<-[purch:PURCHASED]- (c:Customer) , (p2:Product)<-[pu2:PRODUCT]-(o2:Order)<-[purch2:PURCHASED]-(c) WHERE p.productID = "60" AND p.productID <> p2.productID RETURN p2.productID, p2.productName, COUNT(*) as times ORDER BY times DESC
  • 25. GraphDB ? Rivediamo i Contesti precedenti…. ……… Da un punto di vista diverso
  • 27. Web Product Category Cookie ASSOCIATED VIEW - timestamp PART_OF MEMBER_OF E-Mail ADD TO CART - timestamp - quantity BOUGHT - timestamp - quantity Session Traffic Source GENERATE CONTAINED
  • 28. Mobile App Product Category Device ASSOCIATED VIEW - Timestamp - Location - Content PART_OF MEMBER_OF E-Mail ADD TO CART - timestamp - quantity BOUGHT - timestamp - quantity Session Traffic Source GENERATE Content PUBLISH CONTAINED
  • 30. Recommendation Engines • Content Based • Individuare un set di caratteristiche/contenuti in commune tra utenti • Collaborative Filtering • Individuare un usi/comportamenti comuni tra utenti • Hybrid • Mix tra content e collaborative filtering
  • 31. Content Based GOAL: identificare item simili utilizzando attributi o caratteristiche di un prodotto di partenza Esempio: Homer adora birra “Duff” -> Potrebbe interessargli la T-Shirt “Duff”
  • 32. Collaborative Filtering GOAL: suggerire un item sulla base dei comportamenti associati a quell’item da parte dei relative utenti Esempio: Utente A e B condividono comportamenti in commune (pizza e pasta) => potrei suggerire a A quello che piace a B (che A non conosce)
  • 33. Esempi • Have a look http://rejoiner.com/resources/amazon-recommendations- secret-selling-online/
  • 34. Alternating Least Squares • Collaborative Filtering Algorithm • Apache Spark • Real Time… ?
  • 36. MovieLens Recommender • Ingredienti • Movielens 100K dataset • Neo4J (Desktop) • Chyper • Obiettivo • Costruire in modo incrementale un semplice recommendation engine
  • 37. MovieLens Recommender • Data Load • Content Based Recommendation • Collaborative Filtering Recommendations • Simple • Advanced
  • 39. MovieLens - Jaccard Similarity • Movie A VS Movie B • Genres(A) = {“Drama”, “Adult”} • Genres(B) = {“Drama”, “Sci-Fi”, “Horror”} • J(A,B) = LEN({“Drama”}) / LEN({“Drama”, “Sci-Fi”, “Horror”, “Adult”}) = 1/4 Ref: Neo4j Jaccard SImilarity
  • 40. MovieLens – Collaborative Filtering Roberto Matrix Sarah Rambo Avengers EndGame ?
  • 41. MovieLens – Euclidean Distance • User a VS User b • Ratings(a) = { ra1, ra2, … raN } • Ratings(b) = { rb1, rb2, … rbN } • D(a,b) = SQRT( (rb1-ra1)^2 + ….. (rbN-raN)^2 ) • S(a,b) = 1/ 1 + D(a,b) Ref: Neo4j Euclidean SImilarity
  • 42. Euclidean Similarity – Neo4J MATCH (u1:USER{ userId: 1 })-[r1:RATED]->(m:MOVIE)<-[r2:RATED]-(u2:USER) WITH count(m) AS CommonMovies, u1.userId AS user1, u2.userId AS user2, u1, u2 , collect((toFloat(r1.rating)-toFloat(r2.rating))^2) AS ratings, collect(m.title) AS movieNames, collect(m.movieId) AS movieIds WITH u1, u2, CommonMovies, movieNames, movieIds, ratings WHERE CommonMovies > 2 WITH u1, u2, CommonMovies, 1/(1+SQRT(reduce(total=0.0, k in extract(i in ratings | i ) | total+k))) as EUC_SIM ORDER BY EUC_SIM DESC LIMIT 3 MATCH (u2)-[or:RATED]->(om:MOVIE) WHERE NOT ( (u1)-[:RATED]->(om) ) WITH om , EUC_SIM as similarity, or.rating as rating ORDER BY om.movieId, similarity DESC
  • 43. MovieLens – Cosine Similarity • User a VS User b • Ratings(a) = { ra1, ra2, … raN } • Ratings(b) = { rb1, rb2, … rbN } • S(a,b) = [ (rb1*ra1) + ..+ (rbN*raN) ] / [ SQRT(ra1^2+…+raN^2) * SQRT( rb1^2 + ….. + rbN^2 ) Ref: Neo4j Cosine Similarty
  • 44. Cosine Similarity - Neo4J MATCH (u1:USER{ userId:1 })-[x:RATED]->(m:MOVIE)<-[y:RATED]-(u2:USER) WITH u1, u2, COUNT(m) as CommonMovies, COLLECT(m) as CommonMoviesItems , SUM(toFloat(x.rating) * toFloat(y.rating)) AS xyDotProduct , SQRT(REDUCE(xDot = 0.0, a IN COLLECT(toFloat(x.rating)) | xDot + toFloat(a)^2)) AS xProd , SQRT(REDUCE(yDot = 0.0, b IN COLLECT(toFloat(y.rating)) | yDot + toFloat(b)^2)) AS yProd WHERE CommonMovies > 2 WITH u1, u2, CommonMovies, CommonMoviesItems, (xyDotProduct / (xProd * yProd)) as CosineSimilarity ORDER BY CosineSimilarity DESC LIMIT 5 MATCH (u2)-[or:RATED]->(om:MOVIE) WHERE NOT ( (u1)-[:RATED]->(om) ) WITH u2, om , CosineSimilarity, or.rating as rating ORDER BY om.movieId, CosineSimilarity DESC
  • 45. MovieLens – Pearson Similarity • Misura della correlazione lineare tra A e B • Assume valori tra -1 e 1 Ref: Neo4j Person Similarty
  • 47. Instacart Kaggle - Dataset • Website • 3M orders • 200K Users
  • 48. Instacart Kaggle – Alternative Data Model Calcolo Probabilità • di acquistare C dopo aver acquistato B -> P(C|B) • acquistare C dopo aver acquistato B e A -> P(C|A,B) Product A Product B :NEXT - times: 100 Product C :NEXT - times: 30 Product D:NEXT - times: 50
  • 49. Instacart Kaggle - Recommendation MATCH (p:Product{ name = “Chocolate Sandwich Cookies” }) –[r:NEXT] - >(next:Product) RETURN next.name, r.count
  • 51. Apache TinkerPop Graph Computing Framework: Storage + Processor Ref: http://tinkerpop.apache.org/
  • 52. Gremlin Language Graph Traversal Language g .V(“Roberto”) .out(“knows”) .out(“knows”) .value(“name”) Gremlin Console (REPL)
  • 53. Gremlin Server Example Application JanusGraph Gremlin Server Backend Cluster (data + index)
  • 56. Conclusioni • GraphDB offrono una prospettiva “diversa” • Join molto complesse • CTE e operazioni ricorsive • Relazioni tra archi e nodi sono di naturale interpretazione • Attenzione (!) • Versioni Enterprise costano parecchio • Tanti nuovi player -> competizione • Alternativa Cloud -> Amazon Neptune, Azure CosmosDB
  • 57. Conclusioni • Studio • Diversi libri in questo ambito • Diversi Databases e Tool • Spike • Caricate I dati su un GraphDB • Gestionale, Crm, Dati non strutturati • Suggerimenti • In Locale e sul Cloud
  • 58. Conclusioni Next Steps? • Cloud • Hadoop (HBase + Janus + Spark) • Machine Learning
  • 61. Grazie! { “id”: 99 , “name”: “Roberto Grandi” , “mail”: roberto.grandi@gmail.com , “twitter”: @grandirob , “contact me for”: [“help”, “consultancy”, “SW”] , “interests”: [ “SW Development”, “Data Engineering”, “User Behavior” ] }