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