[{"data":1,"prerenderedAt":260},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fdesigning-and-building-a-neo4j-knowledge-graph-from-relational-data":63,"\u002Fblog\u002Fdesigning-and-building-a-neo4j-knowledge-graph-from-relational-data-surround":255},[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":22,"author":65,"body":69,"date":240,"description":241,"extension":242,"image":243,"meta":244,"minRead":251,"navigation":252,"path":23,"seo":253,"stem":24,"__hash__":254},"blog\u002Fblog\u002Fdesigning-and-building-a-neo4j-knowledge-graph-from-relational-data.md",{"name":66,"avatar":67},"Peter Mangoro",{"src":68,"alt":66},"\u002Fprofile.jpg",{"type":70,"value":71,"toc":230},"minimark",[72,76,81,84,114,117,121,128,145,148,152,179,183,186,189,193,213,217],[73,74,75],"p",{},"I treated this assignment as my first serious graph engineering exercise: take a relational dataset, redesign it for graph traversal, and prove the model answers real questions.",[77,78,80],"h2",{"id":79},"assignment-focus","Assignment Focus",[73,82,83],{},"The core task was to move Chinook-style CSV data into Neo4j and model the domain with meaningful nodes and relationships:",[85,86,87,111],"ul",{},[88,89,90,91,95,96,95,99,95,102,95,105,95,108],"li",{},"Nodes: ",[92,93,94],"code",{},"Artist",", ",[92,97,98],{},"Album",[92,100,101],{},"Track",[92,103,104],{},"Genre",[92,106,107],{},"MediaType",[92,109,110],{},"Composer",[88,112,113],{},"Relationships: release, containment, genre\u002Fmedia typing, and composition links",[73,115,116],{},"I also had to ensure the database stayed clean and repeatable across reruns.",[77,118,120],{"id":119},"what-i-built","What I Built",[73,122,123,124,127],{},"I implemented an ingestion sequence that respected entity dependencies and used ",[92,125,126],{},"MERGE"," plus constraints for idempotency:",[85,129,130,133,136,139],{},[88,131,132],{},"Created uniqueness constraints before loading",[88,134,135],{},"Loaded reference entities first, then dependent entities",[88,137,138],{},"Added relationship creation in a separate pass",[88,140,141,142,144],{},"Promoted composer from a raw track property into first-class ",[92,143,110],{}," nodes",[73,146,147],{},"That shift made traversal and composer-level analysis much clearer than string-only storage.",[77,149,151],{"id":150},"key-findings","Key Findings",[85,153,154,161,167,173],{},[88,155,156,160],{},[157,158,159],"strong",{},"Load order is everything"," in graph ingestion: loading dependent entities too early created avoidable misses.",[88,162,163,166],{},[157,164,165],{},"Constraint-first design"," prevented duplicate node growth during retries.",[88,168,169,172],{},[157,170,171],{},"Small data-quality issues"," (null composers, quoted commas, case mismatches) had outsized effects on query results.",[88,174,175,178],{},[157,176,177],{},"Targeted indexes"," improved query responsiveness for filtered lookups by names and titles.",[77,180,182],{"id":181},"lessons-learned","Lessons Learned",[73,184,185],{},"The biggest lesson was that graph projects are won or lost in modeling decisions made before writing many queries. Once labels, IDs, and relationships were stable, the assignment became straightforward and repeatable.",[73,187,188],{},"I also learned that “works once” is not enough. Re-runnability and correctness under re-ingest are part of the deliverable.",[77,190,192],{"id":191},"skills-i-gained","Skills I Gained",[85,194,195,198,207,210],{},[88,196,197],{},"Graph schema design for domain translation (relational -> property graph)",[88,199,200,201,95,204,206],{},"Practical Cypher ingestion patterns (",[92,202,203],{},"LOAD CSV",[92,205,126],{},", relationship creation)",[88,208,209],{},"Constraint and index strategy for correctness and performance",[88,211,212],{},"Debugging ingestion edge cases in real CSV data",[77,214,216],{"id":215},"artifacts","Artifacts",[85,218,219],{},[88,220,221,222],{},"Notebook: ",[223,224,226],"a",{"href":225,"download":226,"target":227,"rel":228},"\u002Fneo4j\u002FP_Mangoro_C1_assn.ipynb","P_Mangoro_C1_assn.ipynb","_blank",[229],"noopener",{"title":231,"searchDepth":232,"depth":232,"links":233},"",2,[234,235,236,237,238,239],{"id":79,"depth":232,"text":80},{"id":119,"depth":232,"text":120},{"id":150,"depth":232,"text":151},{"id":181,"depth":232,"text":182},{"id":191,"depth":232,"text":192},{"id":215,"depth":232,"text":216},"2026-02-20","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.","md","\u002Fblog\u002FgraphDatabase\u002Fnode-properties.svg",{"tags":245},[246,247,248,249,250],"Neo4j","Cypher","Data Modeling","Graph Schema","CSV Ingestion",8,true,{"title":22,"description":241},"VWPJN9ZwxmSfXt2OzCUFLt97qy6G_r1fs9G-f8CbZZY",[256,258],{"title":18,"path":19,"stem":20,"description":257,"children":-1},"How we built a graph-based movie recommendation system by combining collaborative signals, content relationships, and GDS algorithms.",{"title":26,"path":27,"stem":28,"description":259,"children":-1},"How I built a GraphRAG-style research assistant that combines Neo4j graph retrieval, vector search, and grounded LLM answers with citations.",1777326108385]