[{"data":1,"prerenderedAt":285},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fbuilding-a-hybrid-movie-recommender-with-neo4j-and-gds":71,"\u002Fblog\u002Fbuilding-a-hybrid-movie-recommender-with-neo4j-and-gds-surround":280},[4,58],{"title":5,"path":6,"stem":7,"children":8,"page":57},"Blog","\u002Fblog","blog",[9,13,17,21,25,29,33,37,41,45,49,53],{"title":10,"path":11,"stem":12},"Decoding Sentiment: Analysis of 4 Million Amazon Reviews","\u002Fblog\u002Famazon-review-sentiment-capstone","blog\u002Famazon-review-sentiment-capstone",{"title":14,"path":15,"stem":16},"Analyzing a Healthcare Knowledge Graph with Cypher and Graph Data Science","\u002Fblog\u002Fanalyzing-a-healthcare-knowledge-graph-with-cypher-and-gds","blog\u002Fanalyzing-a-healthcare-knowledge-graph-with-cypher-and-gds",{"title":18,"path":19,"stem":20},"Navigating the Web: Prioritizing Supply Chain Risk with Neo4j","\u002Fblog\u002Fautomotive-supply-chain-neo4j-capstone","blog\u002Fautomotive-supply-chain-neo4j-capstone",{"title":22,"path":23,"stem":24},"My First AWS Adventure: Building a Sentiment Analysis System on a Budget","\u002Fblog\u002Faws-sentiment-analysis-journey","blog\u002Faws-sentiment-analysis-journey",{"title":26,"path":27,"stem":28},"Building a Hybrid Movie Recommender with Neo4j and Graph Data Science","\u002Fblog\u002Fbuilding-a-hybrid-movie-recommender-with-neo4j-and-gds","blog\u002Fbuilding-a-hybrid-movie-recommender-with-neo4j-and-gds",{"title":30,"path":31,"stem":32},"Designing and Building a Neo4j Knowledge Graph from Relational Data","\u002Fblog\u002Fdesigning-and-building-a-neo4j-knowledge-graph-from-relational-data","blog\u002Fdesigning-and-building-a-neo4j-knowledge-graph-from-relational-data",{"title":34,"path":35,"stem":36},"Developing a GraphRAG Research Chatbot with Neo4j","\u002Fblog\u002Fdeveloping-a-graphrag-research-chatbot-with-neo4j","blog\u002Fdeveloping-a-graphrag-research-chatbot-with-neo4j",{"title":38,"path":39,"stem":40},"From Code to Insights: My Journey from Software Development to Data Analytics","\u002Fblog\u002Ffrom-code-to-insights-journey","blog\u002Ffrom-code-to-insights-journey",{"title":42,"path":43,"stem":44},"Predicting Hospital Readmissions: A Machine Learning Journey","\u002Fblog\u002Fhospital-readmissions","blog\u002Fhospital-readmissions",{"title":46,"path":47,"stem":48},"My First Steps into Graph Databases: Learning Neo4j Fundamentals","\u002Fblog\u002Fneo4j-graph-databases-fundamentals","blog\u002Fneo4j-graph-databases-fundamentals",{"title":50,"path":51,"stem":52},"Building a Serverless ETL Pipeline on AWS: From Raw Data to Interactive Dashboards","\u002Fblog\u002Fserverless-etl-pipeline-aws","blog\u002Fserverless-etl-pipeline-aws",{"title":54,"path":55,"stem":56},"From Traffic Violations to Safety Culture: My Data Analytics Framework","\u002Fblog\u002Ftraffic-violation-analytics-framework","blog\u002Ftraffic-violation-analytics-framework",false,{"title":59,"path":60,"stem":61,"children":62,"page":57},"Publications","\u002Fpublications","publications",[63,67],{"title":64,"path":65,"stem":66},"PCT-led early warning vital sign escalation","\u002Fpublications\u002Fpct-led-early-warning-escalation","publications\u002Fpct-led-early-warning-escalation",{"title":68,"path":69,"stem":70},"Reducing Phlebotomy Redraws Through Pre-Analytic SOPs: Training, Fidelity, and Outcome Metrics from a Community Hospital","\u002Fpublications\u002Freducing-phlebotomy-redraws-pre-analytic-sops","publications\u002Freducing-phlebotomy-redraws-pre-analytic-sops",{"id":72,"title":26,"author":73,"body":77,"date":265,"description":266,"extension":267,"image":268,"meta":269,"minRead":276,"navigation":277,"path":27,"seo":278,"stem":28,"__hash__":279},"blog\u002Fblog\u002Fbuilding-a-hybrid-movie-recommender-with-neo4j-and-gds.md",{"name":74,"avatar":75},"Peter Mangoro",{"src":76,"alt":74},"\u002Fprofile.jpg",{"type":78,"value":79,"toc":254},"minimark",[80,84,89,92,104,108,111,143,147,178,182,209,213,216,219,223,237,241],[81,82,83],"p",{},"This capstone was where graph modeling and recommendation strategy clicked for me. Instead of treating recommendations as just a matrix problem, we modeled users, movies, genres, and directors as connected entities and used that structure directly.",[85,86,88],"h2",{"id":87},"team-context","Team Context",[81,90,91],{},"This was a collaborative project. Team members included:",[93,94,95,98,101],"ul",{},[96,97,74],"li",{},[96,99,100],{},"Bekithemba Nkomo",[96,102,103],{},"Masheia Dzimba",[85,105,107],{"id":106},"assignment-focus","Assignment Focus",[81,109,110],{},"We built a hybrid recommender by combining:",[93,112,113,125,140],{},[96,114,115,116,120,121,124],{},"collaborative edges (",[117,118,119],"code",{},"User"," -> ",[117,122,123],{},"Movie"," ratings)",[96,126,127,128,120,130,133,134,120,136,139],{},"content structure (",[117,129,123],{},[117,131,132],{},"Genre",", ",[117,135,123],{},[117,137,138],{},"Director",")",[96,141,142],{},"GDS algorithms for similarity, embeddings, and community analysis",[85,144,146],{"id":145},"what-we-built","What We Built",[93,148,149,161,164],{},[96,150,151,152,133,154,133,156,158,159],{},"Graph schema with ",[117,153,119],{},[117,155,123],{},[117,157,132],{},", and ",[117,160,138],{},[96,162,163],{},"Cypher + Python workflows for loading and profiling interactions",[96,165,166,167],{},"Multiple recommendation lenses:\n",[93,168,169,172,175],{},[96,170,171],{},"overlap similarity (Jaccard-like patterns)",[96,173,174],{},"embedding-based retrieval (FastRP + kNN)",[96,176,177],{},"community-aware perspective (Louvain)",[85,179,181],{"id":180},"key-findings","Key Findings",[93,183,184,191,197,203],{},[96,185,186,190],{},[187,188,189],"strong",{},"Content nodes improved explainability",": recommendations could be justified by shared genres\u002Fdirectors, not just co-ratings.",[96,192,193,196],{},[187,194,195],{},"Data sparsity mattered",": in a small dataset, pure collaborative signals were unstable for some users.",[96,198,199,202],{},[187,200,201],{},"Embedding + neighborhood approaches"," offered stronger behavior in sparse pockets than overlap alone.",[96,204,205,208],{},[187,206,207],{},"Community detection"," added a useful segmentation lens for user taste patterns.",[85,210,212],{"id":211},"lessons-learned","Lessons Learned",[81,214,215],{},"The most useful lesson was that hybrid recommenders are not just “add more algorithms.” The graph design itself determines whether recommendations remain interpretable and robust when user behavior is sparse.",[81,217,218],{},"I also learned to frame model choices by business behavior (cold-start, explainability, stability), not by algorithm popularity.",[85,220,222],{"id":221},"skills-i-gained","Skills I Gained",[93,224,225,228,231,234],{},[96,226,227],{},"Hybrid recommender design with graph-native features",[96,229,230],{},"GDS workflow design (projection, similarity, embedding, community detection)",[96,232,233],{},"Evaluation of tradeoffs across sparse user-item graphs",[96,235,236],{},"Collaborative project execution with clear technical handoff points",[85,238,240],{"id":239},"artifacts","Artifacts",[93,242,243],{},[96,244,245,246],{},"Main notebook: ",[247,248,250],"a",{"href":249,"download":250,"target":251,"rel":252},"\u002Fneo4j\u002FP_Mangoro_recommender_project.ipynb","P_Mangoro_recommender_project.ipynb","_blank",[253],"noopener",{"title":255,"searchDepth":256,"depth":256,"links":257},"",2,[258,259,260,261,262,263,264],{"id":87,"depth":256,"text":88},{"id":106,"depth":256,"text":107},{"id":145,"depth":256,"text":146},{"id":180,"depth":256,"text":181},{"id":211,"depth":256,"text":212},{"id":221,"depth":256,"text":222},{"id":239,"depth":256,"text":240},"2026-03-28","How we built a graph-based movie recommendation system by combining collaborative signals, content relationships, and GDS algorithms.","md","\u002Fblog\u002FgraphDatabase\u002Fnode-properties.svg",{"tags":270},[271,272,273,274,275],"Neo4j","Graph Data Science","Recommendation Systems","FastRP","Louvain",9,true,{"title":26,"description":266},"iHfzrigehBmYkN27T34axgxfOYWIMg3fnYmmTzXRurs",[281,283],{"title":22,"path":23,"stem":24,"description":282,"children":-1},"From zero to production-ready: How I built a full-stack sentiment analysis platform entirely within AWS Free Tier, exploring serverless architecture, cost optimization, and creative problem-solving along the way.",{"title":30,"path":31,"stem":32,"description":284,"children":-1},"How I modeled a Chinook-style music dataset as a property graph, loaded it in the right dependency order, and validated it with Cypher queries.",1780158384230]