Coverage for app \ knowledge_graph \ setup_neo4j.py: 0%
107 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-24 13:18 +0530
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-24 13:18 +0530
1from neo4j import GraphDatabase
2import os
3from datetime import datetime, timedelta
5NEO4J_URI = os.getenv("NEO4J_URI", "bolt://localhost:7687")
6NEO4J_USER = os.getenv("NEO4J_USER", "neo4j")
7NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD", "password")
9driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD))
11print("=" * 60)
12print("SETTING UP NEO4J MEDICAL KNOWLEDGE GRAPH - MULTI-PATIENT")
13print("=" * 60)
15with driver.session() as session:
16 # Clear existing data
17 print("\n[1/6] Clearing existing data...")
18 session.run("MATCH (n) DETACH DELETE n")
19 print("✓ Database cleared")
21 # ============================================================
22 # PATIENT 1: John Doe - Type 2 Diabetes + Hypertension
23 # ============================================================
24 print("\n[2/6] Creating Patient 1: John Doe (Type 2 Diabetes + Hypertension)...")
26 session.run("""
27 CREATE (p:Patient {
28 id: "user_1",
29 name: "John Doe",
30 age: 52,
31 gender: "Male",
32 bloodType: "O+",
33 created_at: datetime()
34 })
36 CREATE (d1:Disease {
37 id: "d1_p1",
38 name: "Type 2 Diabetes",
39 category: "Endocrine",
40 severity: "moderate",
41 status: "active",
42 diagnosisDate: date("2018-06-20"),
43 icd10: "E11.9"
44 })
46 CREATE (d2:Disease {
47 id: "d2_p1",
48 name: "Hypertension",
49 category: "Cardiovascular",
50 severity: "moderate",
51 status: "active",
52 diagnosisDate: date("2019-03-15"),
53 icd10: "I10"
54 })
56 CREATE (m1:Medication {
57 id: "m1_p1",
58 name: "Metformin",
59 dosage: "1000mg",
60 frequency: "twice daily",
61 purpose: "Blood sugar control",
62 generic: true,
63 atcCode: "A10BA02"
64 })
66 CREATE (m2:Medication {
67 id: "m2_p1",
68 name: "Lisinopril",
69 dosage: "10mg",
70 frequency: "once daily",
71 purpose: "Blood pressure control",
72 generic: true,
73 atcCode: "C09AA03"
74 })
76 CREATE (m3:Medication {
77 id: "m3_p1",
78 name: "Amlodipine",
79 dosage: "5mg",
80 frequency: "once daily",
81 purpose: "Blood pressure control",
82 generic: true,
83 atcCode: "C08CA01"
84 })
86 CREATE (l1:LabTest {
87 id: "l1_p1",
88 name: "HbA1c",
89 result: 7.2,
90 unit: "%",
91 normalRange: "< 5.7%",
92 status: "slightly elevated",
93 testDate: date("2025-01-10"),
94 testCode: "2345-7"
95 })
97 CREATE (l2:LabTest {
98 id: "l2_p1",
99 name: "Fasting Glucose",
100 result: 135,
101 unit: "mg/dL",
102 normalRange: "70-100 mg/dL",
103 status: "elevated",
104 testDate: date("2025-01-10"),
105 testCode: "1558-6"
106 })
108 CREATE (l3:LabTest {
109 id: "l3_p1",
110 name: "Blood Pressure",
111 result: "142/88",
112 unit: "mmHg",
113 normalRange: "< 120/80 mmHg",
114 status: "stage 1 hypertension",
115 testDate: date("2025-01-10"),
116 testCode: "55284-4"
117 })
119 CREATE (l4:LabTest {
120 id: "l4_p1",
121 name: "Total Cholesterol",
122 result: 210,
123 unit: "mg/dL",
124 normalRange: "< 200 mg/dL",
125 status: "borderline high",
126 testDate: date("2025-01-10"),
127 testCode: "2093-3"
128 })
129 """)
131 # Link Patient 1 data
132 session.run("""
133 MATCH (p:Patient {id: "user_1"}),
134 (d1:Disease {id: "d1_p1"}), (d2:Disease {id: "d2_p1"}),
135 (m1:Medication {id: "m1_p1"}), (m2:Medication {id: "m2_p1"}), (m3:Medication {id: "m3_p1"}),
136 (l1:LabTest {id: "l1_p1"}), (l2:LabTest {id: "l2_p1"}), (l3:LabTest {id: "l3_p1"}), (l4:LabTest {id: "l4_p1"})
137 CREATE (p)-[:HAS_DISEASE]->(d1)
138 CREATE (p)-[:HAS_DISEASE]->(d2)
139 CREATE (d1)-[:TREATED_BY]->(m1)
140 CREATE (d2)-[:TREATED_BY]->(m2)
141 CREATE (d2)-[:TREATED_BY]->(m3)
142 CREATE (p)-[:PRESCRIBED]->(m1)
143 CREATE (p)-[:PRESCRIBED]->(m2)
144 CREATE (p)-[:PRESCRIBED]->(m3)
145 CREATE (d1)-[:HAS_LAB_RESULT]->(l1)
146 CREATE (d1)-[:HAS_LAB_RESULT]->(l2)
147 CREATE (d2)-[:HAS_LAB_RESULT]->(l3)
148 CREATE (d2)-[:HAS_LAB_RESULT]->(l4)
149 """)
151 # Create wearable metrics and readings for Patient 1
152 session.run("""
153 CREATE (wm1:WearableMetric {
154 id: "wm1_p1",
155 type: "blood_glucose",
156 name: "Blood Glucose",
157 unit: "mg/dL",
158 normalRange: "70-100 (fasting)"
159 })
160 CREATE (wm2:WearableMetric {
161 id: "wm2_p1",
162 type: "blood_pressure",
163 name: "Blood Pressure",
164 unit: "mmHg",
165 normalRange: "< 120/80"
166 })
167 CREATE (wm3:WearableMetric {
168 id: "wm3_p1",
169 type: "heart_rate",
170 name: "Heart Rate",
171 unit: "bpm",
172 normalRange: "60-100"
173 })
174 CREATE (wm4:WearableMetric {
175 id: "wm4_p1",
176 type: "steps",
177 name: "Daily Steps",
178 unit: "steps",
179 normalRange: "> 8000"
180 })
181 """)
183 session.run("""
184 MATCH (p:Patient {id: "user_1"}),
185 (wm1:WearableMetric {id: "wm1_p1"}), (wm2:WearableMetric {id: "wm2_p1"}),
186 (wm3:WearableMetric {id: "wm3_p1"}), (wm4:WearableMetric {id: "wm4_p1"})
187 CREATE (p)-[:HAS_METRIC]->(wm1)
188 CREATE (p)-[:HAS_METRIC]->(wm2)
189 CREATE (p)-[:HAS_METRIC]->(wm3)
190 CREATE (p)-[:HAS_METRIC]->(wm4)
191 """)
193 # Readings for Patient 1
194 session.run("""
195 CREATE (r1:Reading {id: "r_bg_1_p1", value: 156, timestamp: datetime("2026-02-08T08:00:00Z")})
196 CREATE (r2:Reading {id: "r_bg_2_p1", value: 142, timestamp: datetime("2026-02-09T08:00:00Z")})
197 CREATE (r3:Reading {id: "r_bp_1_p1", value: "138/88", timestamp: datetime("2026-02-08T08:00:00Z")})
198 CREATE (r4:Reading {id: "r_bp_2_p1", value: "142/90", timestamp: datetime("2026-02-09T08:00:00Z")})
199 CREATE (r5:Reading {id: "r_hr_1_p1", value: 72, timestamp: datetime("2026-02-08T08:00:00Z")})
200 CREATE (r6:Reading {id: "r_hr_2_p1", value: 75, timestamp: datetime("2026-02-09T08:00:00Z")})
201 CREATE (r7:Reading {id: "r_steps_1_p1", value: 8234, timestamp: datetime("2026-02-08T23:59:00Z")})
202 CREATE (r8:Reading {id: "r_steps_2_p1", value: 6500, timestamp: datetime("2026-02-09T23:59:00Z")})
203 """)
205 session.run("""
206 MATCH (wm:WearableMetric {id: "wm1_p1"}), (r:Reading)
207 WHERE r.id IN ["r_bg_1_p1", "r_bg_2_p1"]
208 CREATE (wm)-[:RECORDED_AS]->(r)
209 """)
210 session.run("""
211 MATCH (wm:WearableMetric {id: "wm2_p1"}), (r:Reading)
212 WHERE r.id IN ["r_bp_1_p1", "r_bp_2_p1"]
213 CREATE (wm)-[:RECORDED_AS]->(r)
214 """)
215 session.run("""
216 MATCH (wm:WearableMetric {id: "wm3_p1"}), (r:Reading)
217 WHERE r.id IN ["r_hr_1_p1", "r_hr_2_p1"]
218 CREATE (wm)-[:RECORDED_AS]->(r)
219 """)
220 session.run("""
221 MATCH (wm:WearableMetric {id: "wm4_p1"}), (r:Reading)
222 WHERE r.id IN ["r_steps_1_p1", "r_steps_2_p1"]
223 CREATE (wm)-[:RECORDED_AS]->(r)
224 """)
226 print("✓ Patient 1 complete with all nodes")
228 # ============================================================
229 # PATIENT 2: Sarah Smith - Heart Disease
230 # ============================================================
231 print("\n[3/6] Creating Patient 2: Sarah Smith (Heart Disease)...")
233 session.run("""
234 CREATE (p:Patient {
235 id: "user_2",
236 name: "Sarah Smith",
237 age: 58,
238 gender: "Female",
239 bloodType: "A+",
240 created_at: datetime()
241 })
243 CREATE (d1:Disease {
244 id: "d1_p2",
245 name: "Heart Disease",
246 category: "Cardiovascular",
247 severity: "moderate",
248 status: "active",
249 diagnosisDate: date("2020-01-15"),
250 icd10: "I25.10"
251 })
253 CREATE (m1:Medication {
254 id: "m1_p2",
255 name: "Atorvastatin",
256 dosage: "40mg",
257 frequency: "once daily",
258 purpose: "Cholesterol management",
259 generic: true,
260 atcCode: "C10AA05"
261 })
263 CREATE (m2:Medication {
264 id: "m2_p2",
265 name: "Aspirin",
266 dosage: "81mg",
267 frequency: "once daily",
268 purpose: "Blood thinner",
269 generic: true,
270 atcCode: "B01AC06"
271 })
273 CREATE (m3:Medication {
274 id: "m3_p2",
275 name: "Metoprolol",
276 dosage: "50mg",
277 frequency: "twice daily",
278 purpose: "Heart rate control",
279 generic: true,
280 atcCode: "C07AB02"
281 })
283 CREATE (l1:LabTest {
284 id: "l1_p2",
285 name: "Troponin",
286 result: 0.02,
287 unit: "ng/mL",
288 normalRange: "< 0.04 ng/mL",
289 status: "normal",
290 testDate: date("2025-01-08"),
291 testCode: "6598-7"
292 })
294 CREATE (l2:LabTest {
295 id: "l2_p2",
296 name: "BNP",
297 result: 120,
298 unit: "pg/mL",
299 normalRange: "< 100 pg/mL",
300 status: "slightly elevated",
301 testDate: date("2025-01-08"),
302 testCode: "35637-4"
303 })
305 CREATE (l3:LabTest {
306 id: "l3_p2",
307 name: "LDL Cholesterol",
308 result: 145,
309 unit: "mg/dL",
310 normalRange: "< 100 mg/dL",
311 status: "elevated",
312 testDate: date("2025-01-08"),
313 testCode: "18262-6"
314 })
316 CREATE (l4:LabTest {
317 id: "l4_p2",
318 name: "HDL Cholesterol",
319 result: 42,
320 unit: "mg/dL",
321 normalRange: "> 40 mg/dL",
322 status: "borderline low",
323 testDate: date("2025-01-08"),
324 testCode: "2085-9"
325 })
326 """)
328 session.run("""
329 MATCH (p:Patient {id: "user_2"}),
330 (d1:Disease {id: "d1_p2"}),
331 (m1:Medication {id: "m1_p2"}), (m2:Medication {id: "m2_p2"}), (m3:Medication {id: "m3_p2"}),
332 (l1:LabTest {id: "l1_p2"}), (l2:LabTest {id: "l2_p2"}), (l3:LabTest {id: "l3_p2"}), (l4:LabTest {id: "l4_p2"})
333 CREATE (p)-[:HAS_DISEASE]->(d1)
334 CREATE (d1)-[:TREATED_BY]->(m1)
335 CREATE (d1)-[:TREATED_BY]->(m2)
336 CREATE (d1)-[:TREATED_BY]->(m3)
337 CREATE (p)-[:PRESCRIBED]->(m1)
338 CREATE (p)-[:PRESCRIBED]->(m2)
339 CREATE (p)-[:PRESCRIBED]->(m3)
340 CREATE (d1)-[:HAS_LAB_RESULT]->(l1)
341 CREATE (d1)-[:HAS_LAB_RESULT]->(l2)
342 CREATE (d1)-[:HAS_LAB_RESULT]->(l3)
343 CREATE (d1)-[:HAS_LAB_RESULT]->(l4)
344 """)
346 # Wearables for Patient 2
347 session.run("""
348 CREATE (wm1:WearableMetric {
349 id: "wm1_p2",
350 type: "heart_rate",
351 name: "Heart Rate",
352 unit: "bpm",
353 normalRange: "60-100"
354 })
355 CREATE (wm2:WearableMetric {
356 id: "wm2_p2",
357 type: "blood_pressure",
358 name: "Blood Pressure",
359 unit: "mmHg",
360 normalRange: "< 120/80"
361 })
362 CREATE (wm3:WearableMetric {
363 id: "wm3_p2",
364 type: "ecg",
365 name: "ECG",
366 unit: "rhythm",
367 normalRange: "normal sinus rhythm"
368 })
369 CREATE (wm4:WearableMetric {
370 id: "wm4_p2",
371 type: "steps",
372 name: "Daily Steps",
373 unit: "steps",
374 normalRange: "> 6000"
375 })
376 """)
378 session.run("""
379 MATCH (p:Patient {id: "user_2"}),
380 (wm1:WearableMetric {id: "wm1_p2"}), (wm2:WearableMetric {id: "wm2_p2"}),
381 (wm3:WearableMetric {id: "wm3_p2"}), (wm4:WearableMetric {id: "wm4_p2"})
382 CREATE (p)-[:HAS_METRIC]->(wm1)
383 CREATE (p)-[:HAS_METRIC]->(wm2)
384 CREATE (p)-[:HAS_METRIC]->(wm3)
385 CREATE (p)-[:HAS_METRIC]->(wm4)
386 """)
388 session.run("""
389 CREATE (r1:Reading {id: "r_hr_1_p2", value: 68, timestamp: datetime("2026-02-08T08:00:00Z")})
390 CREATE (r2:Reading {id: "r_hr_2_p2", value: 72, timestamp: datetime("2026-02-09T08:00:00Z")})
391 CREATE (r3:Reading {id: "r_bp_1_p2", value: "125/82", timestamp: datetime("2026-02-08T08:00:00Z")})
392 CREATE (r4:Reading {id: "r_bp_2_p2", value: "128/85", timestamp: datetime("2026-02-09T08:00:00Z")})
393 CREATE (r5:Reading {id: "r_ecg_1_p2", value: "NSR", timestamp: datetime("2026-02-08T08:00:00Z")})
394 CREATE (r6:Reading {id: "r_ecg_2_p2", value: "NSR", timestamp: datetime("2026-02-09T08:00:00Z")})
395 CREATE (r7:Reading {id: "r_steps_1_p2", value: 5234, timestamp: datetime("2026-02-08T23:59:00Z")})
396 CREATE (r8:Reading {id: "r_steps_2_p2", value: 6100, timestamp: datetime("2026-02-09T23:59:00Z")})
397 """)
399 session.run("""MATCH (wm:WearableMetric {id: "wm1_p2"}), (r:Reading) WHERE r.id IN ["r_hr_1_p2", "r_hr_2_p2"] CREATE (wm)-[:RECORDED_AS]->(r)""")
400 session.run("""MATCH (wm:WearableMetric {id: "wm2_p2"}), (r:Reading) WHERE r.id IN ["r_bp_1_p2", "r_bp_2_p2"] CREATE (wm)-[:RECORDED_AS]->(r)""")
401 session.run("""MATCH (wm:WearableMetric {id: "wm3_p2"}), (r:Reading) WHERE r.id IN ["r_ecg_1_p2", "r_ecg_2_p2"] CREATE (wm)-[:RECORDED_AS]->(r)""")
402 session.run("""MATCH (wm:WearableMetric {id: "wm4_p2"}), (r:Reading) WHERE r.id IN ["r_steps_1_p2", "r_steps_2_p2"] CREATE (wm)-[:RECORDED_AS]->(r)""")
404 print("✓ Patient 2 complete with all nodes")
406 # ============================================================
407 # PATIENT 3: Michael Johnson - Asthma
408 # ============================================================
409 print("\n[4/6] Creating Patient 3: Michael Johnson (Asthma)...")
411 session.run("""
412 CREATE (p:Patient {
413 id: "user_3",
414 name: "Michael Johnson",
415 age: 34,
416 gender: "Male",
417 bloodType: "B+",
418 created_at: datetime()
419 })
421 CREATE (d1:Disease {
422 id: "d1_p3",
423 name: "Asthma",
424 category: "Respiratory",
425 severity: "moderate",
426 status: "active",
427 diagnosisDate: date("2015-09-12"),
428 icd10: "J45.20"
429 })
431 CREATE (m1:Medication {
432 id: "m1_p3",
433 name: "Albuterol Inhaler",
434 dosage: "90mcg",
435 frequency: "as needed",
436 purpose: "Quick relief bronchodilator",
437 generic: true,
438 atcCode: "R03AC02"
439 })
441 CREATE (m2:Medication {
442 id: "m2_p3",
443 name: "Fluticasone Inhaler",
444 dosage: "220mcg",
445 frequency: "twice daily",
446 purpose: "Long-term asthma control",
447 generic: false,
448 atcCode: "R03BA05"
449 })
451 CREATE (m3:Medication {
452 id: "m3_p3",
453 name: "Montelukast",
454 dosage: "10mg",
455 frequency: "once daily",
456 purpose: "Asthma control",
457 generic: true,
458 atcCode: "R03DC03"
459 })
461 CREATE (l1:LabTest {
462 id: "l1_p3",
463 name: "Spirometry FEV1",
464 result: 78,
465 unit: "% predicted",
466 normalRange: "> 80%",
467 status: "slightly reduced",
468 testDate: date("2025-01-05"),
469 testCode: "20150-9"
470 })
472 CREATE (l2:LabTest {
473 id: "l2_p3",
474 name: "Peak Flow",
475 result: 420,
476 unit: "L/min",
477 normalRange: "450-550 L/min",
478 status: "reduced",
479 testDate: date("2025-01-05"),
480 testCode: "19935-6"
481 })
483 CREATE (l3:LabTest {
484 id: "l3_p3",
485 name: "IgE Total",
486 result: 245,
487 unit: "IU/mL",
488 normalRange: "< 100 IU/mL",
489 status: "elevated",
490 testDate: date("2025-01-05"),
491 testCode: "19113-0"
492 })
494 CREATE (l4:LabTest {
495 id: "l4_p3",
496 name: "Eosinophil Count",
497 result: 520,
498 unit: "cells/μL",
499 normalRange: "< 500 cells/μL",
500 status: "slightly elevated",
501 testDate: date("2025-01-05"),
502 testCode: "713-8"
503 })
504 """)
506 session.run("""
507 MATCH (p:Patient {id: "user_3"}),
508 (d1:Disease {id: "d1_p3"}),
509 (m1:Medication {id: "m1_p3"}), (m2:Medication {id: "m2_p3"}), (m3:Medication {id: "m3_p3"}),
510 (l1:LabTest {id: "l1_p3"}), (l2:LabTest {id: "l2_p3"}), (l3:LabTest {id: "l3_p3"}), (l4:LabTest {id: "l4_p3"})
511 CREATE (p)-[:HAS_DISEASE]->(d1)
512 CREATE (d1)-[:TREATED_BY]->(m1)
513 CREATE (d1)-[:TREATED_BY]->(m2)
514 CREATE (d1)-[:TREATED_BY]->(m3)
515 CREATE (p)-[:PRESCRIBED]->(m1)
516 CREATE (p)-[:PRESCRIBED]->(m2)
517 CREATE (p)-[:PRESCRIBED]->(m3)
518 CREATE (d1)-[:HAS_LAB_RESULT]->(l1)
519 CREATE (d1)-[:HAS_LAB_RESULT]->(l2)
520 CREATE (d1)-[:HAS_LAB_RESULT]->(l3)
521 CREATE (d1)-[:HAS_LAB_RESULT]->(l4)
522 """)
524 # Wearables for Patient 3
525 session.run("""
526 CREATE (wm1:WearableMetric {
527 id: "wm1_p3",
528 type: "peak_flow",
529 name: "Peak Flow",
530 unit: "L/min",
531 normalRange: "450-550"
532 })
533 CREATE (wm2:WearableMetric {
534 id: "wm2_p3",
535 type: "respiratory_rate",
536 name: "Respiratory Rate",
537 unit: "breaths/min",
538 normalRange: "12-20"
539 })
540 CREATE (wm3:WearableMetric {
541 id: "wm3_p3",
542 type: "spo2",
543 name: "Blood Oxygen",
544 unit: "%",
545 normalRange: "> 95%"
546 })
547 CREATE (wm4:WearableMetric {
548 id: "wm4_p3",
549 type: "steps",
550 name: "Daily Steps",
551 unit: "steps",
552 normalRange: "> 10000"
553 })
554 """)
556 session.run("""
557 MATCH (p:Patient {id: "user_3"}),
558 (wm1:WearableMetric {id: "wm1_p3"}), (wm2:WearableMetric {id: "wm2_p3"}),
559 (wm3:WearableMetric {id: "wm3_p3"}), (wm4:WearableMetric {id: "wm4_p3"})
560 CREATE (p)-[:HAS_METRIC]->(wm1)
561 CREATE (p)-[:HAS_METRIC]->(wm2)
562 CREATE (p)-[:HAS_METRIC]->(wm3)
563 CREATE (p)-[:HAS_METRIC]->(wm4)
564 """)
566 session.run("""
567 CREATE (r1:Reading {id: "r_pf_1_p3", value: 420, timestamp: datetime("2026-02-08T08:00:00Z")})
568 CREATE (r2:Reading {id: "r_pf_2_p3", value: 435, timestamp: datetime("2026-02-09T08:00:00Z")})
569 CREATE (r3:Reading {id: "r_rr_1_p3", value: 16, timestamp: datetime("2026-02-08T08:00:00Z")})
570 CREATE (r4:Reading {id: "r_rr_2_p3", value: 15, timestamp: datetime("2026-02-09T08:00:00Z")})
571 CREATE (r5:Reading {id: "r_spo2_1_p3", value: 97, timestamp: datetime("2026-02-08T08:00:00Z")})
572 CREATE (r6:Reading {id: "r_spo2_2_p3", value: 98, timestamp: datetime("2026-02-09T08:00:00Z")})
573 CREATE (r7:Reading {id: "r_steps_1_p3", value: 11234, timestamp: datetime("2026-02-08T23:59:00Z")})
574 CREATE (r8:Reading {id: "r_steps_2_p3", value: 9800, timestamp: datetime("2026-02-09T23:59:00Z")})
575 """)
577 session.run("""MATCH (wm:WearableMetric {id: "wm1_p3"}), (r:Reading) WHERE r.id IN ["r_pf_1_p3", "r_pf_2_p3"] CREATE (wm)-[:RECORDED_AS]->(r)""")
578 session.run("""MATCH (wm:WearableMetric {id: "wm2_p3"}), (r:Reading) WHERE r.id IN ["r_rr_1_p3", "r_rr_2_p3"] CREATE (wm)-[:RECORDED_AS]->(r)""")
579 session.run("""MATCH (wm:WearableMetric {id: "wm3_p3"}), (r:Reading) WHERE r.id IN ["r_spo2_1_p3", "r_spo2_2_p3"] CREATE (wm)-[:RECORDED_AS]->(r)""")
580 session.run("""MATCH (wm:WearableMetric {id: "wm4_p3"}), (r:Reading) WHERE r.id IN ["r_steps_1_p3", "r_steps_2_p3"] CREATE (wm)-[:RECORDED_AS]->(r)""")
582 print("✓ Patient 3 complete with all nodes")
584 # ============================================================
585 # PATIENT 4: Emily Davis - Chronic Kidney Disease
586 # ============================================================
587 print("\n[5/6] Creating Patient 4: Emily Davis (Chronic Kidney Disease)...")
589 session.run("""
590 CREATE (p:Patient {
591 id: "user_4",
592 name: "Emily Davis",
593 age: 64,
594 gender: "Female",
595 bloodType: "AB+",
596 created_at: datetime()
597 })
599 CREATE (d1:Disease {
600 id: "d1_p4",
601 name: "Chronic Kidney Disease",
602 category: "Renal",
603 severity: "moderate",
604 status: "active",
605 diagnosisDate: date("2021-11-03"),
606 icd10: "N18.3"
607 })
609 CREATE (m1:Medication {
610 id: "m1_p4",
611 name: "Losartan",
612 dosage: "50mg",
613 frequency: "once daily",
614 purpose: "Blood pressure and kidney protection",
615 generic: true,
616 atcCode: "C09CA01"
617 })
619 CREATE (m2:Medication {
620 id: "m2_p4",
621 name: "Furosemide",
622 dosage: "40mg",
623 frequency: "once daily",
624 purpose: "Fluid management",
625 generic: true,
626 atcCode: "C03CA01"
627 })
629 CREATE (m3:Medication {
630 id: "m3_p4",
631 name: "Calcium Carbonate",
632 dosage: "500mg",
633 frequency: "three times daily",
634 purpose: "Phosphate binder",
635 generic: true,
636 atcCode: "A12AA04"
637 })
639 CREATE (m4:Medication {
640 id: "m4_p4",
641 name: "Erythropoietin",
642 dosage: "4000 units",
643 frequency: "weekly injection",
644 purpose: "Anemia management",
645 generic: false,
646 atcCode: "B03XA01"
647 })
649 CREATE (l1:LabTest {
650 id: "l1_p4",
651 name: "Creatinine",
652 result: 2.8,
653 unit: "mg/dL",
654 normalRange: "0.7-1.3 mg/dL",
655 status: "elevated",
656 testDate: date("2025-01-12"),
657 testCode: "2160-0"
658 })
660 CREATE (l2:LabTest {
661 id: "l2_p4",
662 name: "eGFR",
663 result: 42,
664 unit: "mL/min/1.73m²",
665 normalRange: "> 90 mL/min/1.73m²",
666 status: "stage 3 CKD",
667 testDate: date("2025-01-12"),
668 testCode: "33914-3"
669 })
671 CREATE (l3:LabTest {
672 id: "l3_p4",
673 name: "Potassium",
674 result: 5.2,
675 unit: "mEq/L",
676 normalRange: "3.5-5.0 mEq/L",
677 status: "slightly elevated",
678 testDate: date("2025-01-12"),
679 testCode: "2823-3"
680 })
682 CREATE (l4:LabTest {
683 id: "l4_p4",
684 name: "Phosphorus",
685 result: 5.8,
686 unit: "mg/dL",
687 normalRange: "2.5-4.5 mg/dL",
688 status: "elevated",
689 testDate: date("2025-01-12"),
690 testCode: "2777-1"
691 })
693 CREATE (l5:LabTest {
694 id: "l5_p4",
695 name: "Hemoglobin",
696 result: 10.2,
697 unit: "g/dL",
698 normalRange: "12-16 g/dL",
699 status: "anemia",
700 testDate: date("2025-01-12"),
701 testCode: "718-7"
702 })
703 """)
705 session.run("""
706 MATCH (p:Patient {id: "user_4"}),
707 (d1:Disease {id: "d1_p4"}),
708 (m1:Medication {id: "m1_p4"}), (m2:Medication {id: "m2_p4"}),
709 (m3:Medication {id: "m3_p4"}), (m4:Medication {id: "m4_p4"}),
710 (l1:LabTest {id: "l1_p4"}), (l2:LabTest {id: "l2_p4"}),
711 (l3:LabTest {id: "l3_p4"}), (l4:LabTest {id: "l4_p4"}), (l5:LabTest {id: "l5_p4"})
712 CREATE (p)-[:HAS_DISEASE]->(d1)
713 CREATE (d1)-[:TREATED_BY]->(m1)
714 CREATE (d1)-[:TREATED_BY]->(m2)
715 CREATE (d1)-[:TREATED_BY]->(m3)
716 CREATE (d1)-[:TREATED_BY]->(m4)
717 CREATE (p)-[:PRESCRIBED]->(m1)
718 CREATE (p)-[:PRESCRIBED]->(m2)
719 CREATE (p)-[:PRESCRIBED]->(m3)
720 CREATE (p)-[:PRESCRIBED]->(m4)
721 CREATE (d1)-[:HAS_LAB_RESULT]->(l1)
722 CREATE (d1)-[:HAS_LAB_RESULT]->(l2)
723 CREATE (d1)-[:HAS_LAB_RESULT]->(l3)
724 CREATE (d1)-[:HAS_LAB_RESULT]->(l4)
725 CREATE (d1)-[:HAS_LAB_RESULT]->(l5)
726 """)
728 # Wearables for Patient 4
729 session.run("""
730 CREATE (wm1:WearableMetric {
731 id: "wm1_p4",
732 type: "blood_pressure",
733 name: "Blood Pressure",
734 unit: "mmHg",
735 normalRange: "< 130/80"
736 })
737 CREATE (wm2:WearableMetric {
738 id: "wm2_p4",
739 type: "weight",
740 name: "Body Weight",
741 unit: "kg",
742 normalRange: "stable"
743 })
744 CREATE (wm3:WearableMetric {
745 id: "wm3_p4",
746 type: "fluid_intake",
747 name: "Fluid Intake",
748 unit: "mL",
749 normalRange: "1500-2000"
750 })
751 CREATE (wm4:WearableMetric {
752 id: "wm4_p4",
753 type: "steps",
754 name: "Daily Steps",
755 unit: "steps",
756 normalRange: "> 5000"
757 })
758 """)
760 session.run("""
761 MATCH (p:Patient {id: "user_4"}),
762 (wm1:WearableMetric {id: "wm1_p4"}), (wm2:WearableMetric {id: "wm2_p4"}),
763 (wm3:WearableMetric {id: "wm3_p4"}), (wm4:WearableMetric {id: "wm4_p4"})
764 CREATE (p)-[:HAS_METRIC]->(wm1)
765 CREATE (p)-[:HAS_METRIC]->(wm2)
766 CREATE (p)-[:HAS_METRIC]->(wm3)
767 CREATE (p)-[:HAS_METRIC]->(wm4)
768 """)
770 session.run("""
771 CREATE (r1:Reading {id: "r_bp_1_p4", value: "135/85", timestamp: datetime("2026-02-08T08:00:00Z")})
772 CREATE (r2:Reading {id: "r_bp_2_p4", value: "132/82", timestamp: datetime("2026-02-09T08:00:00Z")})
773 CREATE (r3:Reading {id: "r_wt_1_p4", value: 72.5, timestamp: datetime("2026-02-08T07:00:00Z")})
774 CREATE (r4:Reading {id: "r_wt_2_p4", value: 72.8, timestamp: datetime("2026-02-09T07:00:00Z")})
775 CREATE (r5:Reading {id: "r_fl_1_p4", value: 1650, timestamp: datetime("2026-02-08T23:59:00Z")})
776 CREATE (r6:Reading {id: "r_fl_2_p4", value: 1720, timestamp: datetime("2026-02-09T23:59:00Z")})
777 CREATE (r7:Reading {id: "r_steps_1_p4", value: 4234, timestamp: datetime("2026-02-08T23:59:00Z")})
778 CREATE (r8:Reading {id: "r_steps_2_p4", value: 5100, timestamp: datetime("2026-02-09T23:59:00Z")})
779 """)
781 session.run("""MATCH (wm:WearableMetric {id: "wm1_p4"}), (r:Reading) WHERE r.id IN ["r_bp_1_p4", "r_bp_2_p4"] CREATE (wm)-[:RECORDED_AS]->(r)""")
782 session.run("""MATCH (wm:WearableMetric {id: "wm2_p4"}), (r:Reading) WHERE r.id IN ["r_wt_1_p4", "r_wt_2_p4"] CREATE (wm)-[:RECORDED_AS]->(r)""")
783 session.run("""MATCH (wm:WearableMetric {id: "wm3_p4"}), (r:Reading) WHERE r.id IN ["r_fl_1_p4", "r_fl_2_p4"] CREATE (wm)-[:RECORDED_AS]->(r)""")
784 session.run("""MATCH (wm:WearableMetric {id: "wm4_p4"}), (r:Reading) WHERE r.id IN ["r_steps_1_p4", "r_steps_2_p4"] CREATE (wm)-[:RECORDED_AS]->(r)""")
786 print("✓ Patient 4 complete with all nodes")
788 # ============================================================
789 # PATIENT 5: Robert Brown - Multiple Conditions
790 # (Type 2 Diabetes + Hypertension + Heart Disease)
791 # ============================================================
792 print("\n[6/6] Creating Patient 5: Robert Brown (Multiple Conditions)...")
794 session.run("""
795 CREATE (p:Patient {
796 id: "user_5",
797 name: "Robert Brown",
798 age: 71,
799 gender: "Male",
800 bloodType: "O-",
801 created_at: datetime()
802 })
804 CREATE (d1:Disease {
805 id: "d1_p5",
806 name: "Type 2 Diabetes",
807 category: "Endocrine",
808 severity: "severe",
809 status: "active",
810 diagnosisDate: date("2012-04-10"),
811 icd10: "E11.9"
812 })
814 CREATE (d2:Disease {
815 id: "d2_p5",
816 name: "Hypertension",
817 category: "Cardiovascular",
818 severity: "moderate",
819 status: "active",
820 diagnosisDate: date("2010-07-22"),
821 icd10: "I10"
822 })
824 CREATE (d3:Disease {
825 id: "d3_p5",
826 name: "Heart Disease",
827 category: "Cardiovascular",
828 severity: "moderate",
829 status: "active",
830 diagnosisDate: date("2019-02-15"),
831 icd10: "I25.10"
832 })
834 CREATE (m1:Medication {
835 id: "m1_p5",
836 name: "Insulin Glargine",
837 dosage: "20 units",
838 frequency: "once daily",
839 purpose: "Blood sugar control",
840 generic: false,
841 atcCode: "A10AE04"
842 })
844 CREATE (m2:Medication {
845 id: "m2_p5",
846 name: "Metformin",
847 dosage: "1000mg",
848 frequency: "twice daily",
849 purpose: "Blood sugar control",
850 generic: true,
851 atcCode: "A10BA02"
852 })
854 CREATE (m3:Medication {
855 id: "m3_p5",
856 name: "Amlodipine",
857 dosage: "10mg",
858 frequency: "once daily",
859 purpose: "Blood pressure control",
860 generic: true,
861 atcCode: "C08CA01"
862 })
864 CREATE (m4:Medication {
865 id: "m4_p5",
866 name: "Atorvastatin",
867 dosage: "80mg",
868 frequency: "once daily",
869 purpose: "Cholesterol management",
870 generic: true,
871 atcCode: "C10AA05"
872 })
874 CREATE (m5:Medication {
875 id: "m5_p5",
876 name: "Aspirin",
877 dosage: "81mg",
878 frequency: "once daily",
879 purpose: "Blood thinner",
880 generic: true,
881 atcCode: "B01AC06"
882 })
884 CREATE (m6:Medication {
885 id: "m6_p5",
886 name: "Carvedilol",
887 dosage: "25mg",
888 frequency: "twice daily",
889 purpose: "Heart failure management",
890 generic: true,
891 atcCode: "C07AG02"
892 })
894 CREATE (l1:LabTest {
895 id: "l1_p5",
896 name: "HbA1c",
897 result: 8.5,
898 unit: "%",
899 normalRange: "< 5.7%",
900 status: "poorly controlled",
901 testDate: date("2025-01-15"),
902 testCode: "2345-7"
903 })
905 CREATE (l2:LabTest {
906 id: "l2_p5",
907 name: "Fasting Glucose",
908 result: 185,
909 unit: "mg/dL",
910 normalRange: "70-100 mg/dL",
911 status: "high",
912 testDate: date("2025-01-15"),
913 testCode: "1558-6"
914 })
916 CREATE (l3:LabTest {
917 id: "l3_p5",
918 name: "BNP",
919 result: 280,
920 unit: "pg/mL",
921 normalRange: "< 100 pg/mL",
922 status: "elevated",
923 testDate: date("2025-01-15"),
924 testCode: "35637-4"
925 })
927 CREATE (l4:LabTest {
928 id: "l4_p5",
929 name: "LDL Cholesterol",
930 result: 95,
931 unit: "mg/dL",
932 normalRange: "< 100 mg/dL",
933 status: "near target",
934 testDate: date("2025-01-15"),
935 testCode: "18262-6"
936 })
938 CREATE (l5:LabTest {
939 id: "l5_p5",
940 name: "Blood Pressure",
941 result: "148/92",
942 unit: "mmHg",
943 normalRange: "< 120/80 mmHg",
944 status: "stage 2 hypertension",
945 testDate: date("2025-01-15"),
946 testCode: "55284-4"
947 })
948 """)
950 session.run("""
951 MATCH (p:Patient {id: "user_5"}),
952 (d1:Disease {id: "d1_p5"}), (d2:Disease {id: "d2_p5"}), (d3:Disease {id: "d3_p5"}),
953 (m1:Medication {id: "m1_p5"}), (m2:Medication {id: "m2_p5"}),
954 (m3:Medication {id: "m3_p5"}), (m4:Medication {id: "m4_p5"}),
955 (m5:Medication {id: "m5_p5"}), (m6:Medication {id: "m6_p5"}),
956 (l1:LabTest {id: "l1_p5"}), (l2:LabTest {id: "l2_p5"}),
957 (l3:LabTest {id: "l3_p5"}), (l4:LabTest {id: "l4_p5"}), (l5:LabTest {id: "l5_p5"})
958 CREATE (p)-[:HAS_DISEASE]->(d1)
959 CREATE (p)-[:HAS_DISEASE]->(d2)
960 CREATE (p)-[:HAS_DISEASE]->(d3)
961 CREATE (d1)-[:TREATED_BY]->(m1)
962 CREATE (d1)-[:TREATED_BY]->(m2)
963 CREATE (d2)-[:TREATED_BY]->(m3)
964 CREATE (d3)-[:TREATED_BY]->(m4)
965 CREATE (d3)-[:TREATED_BY]->(m5)
966 CREATE (d3)-[:TREATED_BY]->(m6)
967 CREATE (p)-[:PRESCRIBED]->(m1)
968 CREATE (p)-[:PRESCRIBED]->(m2)
969 CREATE (p)-[:PRESCRIBED]->(m3)
970 CREATE (p)-[:PRESCRIBED]->(m4)
971 CREATE (p)-[:PRESCRIBED]->(m5)
972 CREATE (p)-[:PRESCRIBED]->(m6)
973 CREATE (d1)-[:HAS_LAB_RESULT]->(l1)
974 CREATE (d1)-[:HAS_LAB_RESULT]->(l2)
975 CREATE (d2)-[:HAS_LAB_RESULT]->(l5)
976 CREATE (d3)-[:HAS_LAB_RESULT]->(l3)
977 CREATE (d3)-[:HAS_LAB_RESULT]->(l4)
978 """)
980 # Wearables for Patient 5
981 session.run("""
982 CREATE (wm1:WearableMetric {
983 id: "wm1_p5",
984 type: "blood_glucose",
985 name: "Blood Glucose",
986 unit: "mg/dL",
987 normalRange: "70-130"
988 })
989 CREATE (wm2:WearableMetric {
990 id: "wm2_p5",
991 type: "blood_pressure",
992 name: "Blood Pressure",
993 unit: "mmHg",
994 normalRange: "< 130/80"
995 })
996 CREATE (wm3:WearableMetric {
997 id: "wm3_p5",
998 type: "heart_rate",
999 name: "Heart Rate",
1000 unit: "bpm",
1001 normalRange: "60-100"
1002 })
1003 CREATE (wm4:WearableMetric {
1004 id: "wm4_p5",
1005 type: "weight",
1006 name: "Body Weight",
1007 unit: "kg",
1008 normalRange: "stable"
1009 })
1010 CREATE (wm5:WearableMetric {
1011 id: "wm5_p5",
1012 type: "steps",
1013 name: "Daily Steps",
1014 unit: "steps",
1015 normalRange: "> 5000"
1016 })
1017 """)
1019 session.run("""
1020 MATCH (p:Patient {id: "user_5"}),
1021 (wm1:WearableMetric {id: "wm1_p5"}), (wm2:WearableMetric {id: "wm2_p5"}),
1022 (wm3:WearableMetric {id: "wm3_p5"}), (wm4:WearableMetric {id: "wm4_p5"}),
1023 (wm5:WearableMetric {id: "wm5_p5"})
1024 CREATE (p)-[:HAS_METRIC]->(wm1)
1025 CREATE (p)-[:HAS_METRIC]->(wm2)
1026 CREATE (p)-[:HAS_METRIC]->(wm3)
1027 CREATE (p)-[:HAS_METRIC]->(wm4)
1028 CREATE (p)-[:HAS_METRIC]->(wm5)
1029 """)
1031 session.run("""
1032 CREATE (r1:Reading {id: "r_bg_1_p5", value: 178, timestamp: datetime("2026-02-08T08:00:00Z")})
1033 CREATE (r2:Reading {id: "r_bg_2_p5", value: 192, timestamp: datetime("2026-02-09T08:00:00Z")})
1034 CREATE (r3:Reading {id: "r_bp_1_p5", value: "145/90", timestamp: datetime("2026-02-08T08:00:00Z")})
1035 CREATE (r4:Reading {id: "r_bp_2_p5", value: "148/92", timestamp: datetime("2026-02-09T08:00:00Z")})
1036 CREATE (r5:Reading {id: "r_hr_1_p5", value: 78, timestamp: datetime("2026-02-08T08:00:00Z")})
1037 CREATE (r6:Reading {id: "r_hr_2_p5", value: 82, timestamp: datetime("2026-02-09T08:00:00Z")})
1038 CREATE (r7:Reading {id: "r_wt_1_p5", value: 88.2, timestamp: datetime("2026-02-08T07:00:00Z")})
1039 CREATE (r8:Reading {id: "r_wt_2_p5", value: 88.5, timestamp: datetime("2026-02-09T07:00:00Z")})
1040 CREATE (r9:Reading {id: "r_steps_1_p5", value: 3234, timestamp: datetime("2026-02-08T23:59:00Z")})
1041 CREATE (r10:Reading {id: "r_steps_2_p5", value: 4100, timestamp: datetime("2026-02-09T23:59:00Z")})
1042 """)
1044 session.run("""MATCH (wm:WearableMetric {id: "wm1_p5"}), (r:Reading) WHERE r.id IN ["r_bg_1_p5", "r_bg_2_p5"] CREATE (wm)-[:RECORDED_AS]->(r)""")
1045 session.run("""MATCH (wm:WearableMetric {id: "wm2_p5"}), (r:Reading) WHERE r.id IN ["r_bp_1_p5", "r_bp_2_p5"] CREATE (wm)-[:RECORDED_AS]->(r)""")
1046 session.run("""MATCH (wm:WearableMetric {id: "wm3_p5"}), (r:Reading) WHERE r.id IN ["r_hr_1_p5", "r_hr_2_p5"] CREATE (wm)-[:RECORDED_AS]->(r)""")
1047 session.run("""MATCH (wm:WearableMetric {id: "wm4_p5"}), (r:Reading) WHERE r.id IN ["r_wt_1_p5", "r_wt_2_p5"] CREATE (wm)-[:RECORDED_AS]->(r)""")
1048 session.run("""MATCH (wm:WearableMetric {id: "wm5_p5"}), (r:Reading) WHERE r.id IN ["r_steps_1_p5", "r_steps_2_p5"] CREATE (wm)-[:RECORDED_AS]->(r)""")
1050 print("✓ Patient 5 complete with all nodes")
1052 # Verify the setup
1053 print("\n" + "=" * 60)
1054 print("VERIFICATION - ALL PATIENTS")
1055 print("=" * 60)
1057 for patient_id in ["user_1", "user_2", "user_3", "user_4", "user_5"]:
1058 result = session.run("""
1059 MATCH (p:Patient {id: $patient_id})
1060 OPTIONAL MATCH (p)-[:HAS_DISEASE]->(d:Disease)
1061 OPTIONAL MATCH (d)-[:TREATED_BY]->(m:Medication)
1062 OPTIONAL MATCH (p)-[:PRESCRIBED]->(pm:Medication)
1063 OPTIONAL MATCH (d)-[:HAS_LAB_RESULT]->(l:LabTest)
1064 OPTIONAL MATCH (p)-[:HAS_METRIC]->(wm:WearableMetric)
1065 OPTIONAL MATCH (wm)-[:RECORDED_AS]->(r:Reading)
1066 RETURN
1067 p.name AS patient,
1068 p.age AS age,
1069 collect(DISTINCT d.name) AS diseases,
1070 collect(DISTINCT pm.name) AS medications,
1071 collect(DISTINCT l.name) AS labs,
1072 collect(DISTINCT wm.name) AS wearables,
1073 count(DISTINCT r) AS reading_count
1074 """, patient_id=patient_id)
1076 record = result.single()
1077 if record:
1078 print(f"\n✓ Patient: {record['patient']} (Age: {record['age']})")
1079 print(f" - Diseases: {', '.join([d for d in record['diseases'] if d])}")
1080 print(f" - Medications: {', '.join([m for m in record['medications'] if m])}")
1081 print(f" - Lab tests: {len([l for l in record['labs'] if l])}")
1082 print(f" - Wearable metrics: {len([w for w in record['wearables'] if w])}")
1083 print(f" - Total readings: {record['reading_count']}")
1085 # Count total data
1086 result = session.run("MATCH (n) RETURN count(n) as count")
1087 total = result.single()["count"]
1088 print(f"\n{'=' * 60}")
1089 print(f"✓ Total nodes created: {total}")
1091 # Count by type
1092 result = session.run("""
1093 MATCH (n)
1094 RETURN labels(n)[0] AS label, count(n) AS count
1095 ORDER BY count DESC
1096 """)
1097 print(f"\nNode breakdown:")
1098 for record in result:
1099 print(f" - {record['label']}: {record['count']}")
1101driver.close()
1103print("\n" + "=" * 60)
1104print("✓ MULTI-PATIENT NEO4J SETUP COMPLETE!")
1105print("=" * 60)
1106print("\nPatient Summary:")
1107print(" 1. John Doe (52) - Type 2 Diabetes + Hypertension")
1108print(" 2. Sarah Smith (58) - Heart Disease")
1109print(" 3. Michael Johnson (34) - Asthma")
1110print(" 4. Emily Davis (64) - Chronic Kidney Disease")
1111print(" 5. Robert Brown (71) - Type 2 Diabetes + Hypertension + Heart Disease")
1112print("\nAll patients have complete medical profiles including:")
1113print(" ✓ Diseases with ICD-10 codes")
1114print(" ✓ Medications with dosages and ATC codes")
1115print(" ✓ Lab test results")
1116print(" ✓ Wearable metrics and readings")
1117print("=" * 60)