Portavita HL7 RIM database HL7 applicatie-architectuur SIG 29 januari 2008 Ir. Yeb Havinga http://www.portavita.nl/ -1-
Inhoudsopgave 1) 2) 3) 4) 5) 6)
Achtergrond en motivatie NEDSS Antistolling, CVA en Diabetes Architectuur overzicht Techniek constraints Toekomstplannen
-2-
Portavita 1) “Portavita Multidisciplinair EPD” - web-based chronic disease management (CDM)
Antistolling CVA Diabetes COPD (binnenkort) hartfalen (binnenkort)
2) Special projects
Medical trials, e111 pas, EVSH, MCDC
-3-
Historie Portavita Multidisciplinair EPD 1) 2001 pilot
Database was een verzameling HL7 v2 XML berichten Pilot was succesvol: doorontwikkelen naar product Ervaring met 'XML database': Slechte performance bij grote aantallen documenten Programmeren queries en updates 'veel gedoe' in vergelijking met normale database access.
2) 2003 voorbereiding VERSIE 2 Wat
is een toekomstbestendige architectuur voor een CDM applicatie?
-4-
Observaties Portavita IT-team 1) Gros in-house ontworpen database schema's overleeft de tand des tijds slecht 2) Na de bouw van een informatiesysteem is het domein beter begrepen
Herbouw wenselijk
3) Verschillen in ontwerpstijl & onduidelijkheid of onbegrip van origineel ontwerp
Na verloop van tijd een onsamenhangend database schema
-5-
Eigenschappen CDM applicatie 1) Looptijd applicatie
Oneindig
2) Software updates en nieuwe functionaliteit
Continu proces; onderdeel dagelijkse routine
3) Houdbaarheid medische informatie
Onbeperkt
-6-
Ontwikkelfilosofie Portavita V2 1) Voor het database schema : onderdruk elke neiging tot eigen creativiteit 2) Lift mee op ervaring van domein experts 3) Gebruik producten en technologieën die zichzelf bewezen hebben
doe niet mee met 'mode'-technologiën en frameworks
4) Ken de producten die je gebruikt als je broekzak
zodat je niet teveel zelf bouwt
-7-
Informatiemodellen in Portavita V2 1) Workflow Management Coalition (WfMC)
Proces modellering, workflow en autorisatie
2) Vektis ZH38/ZH39
Financiële gegevens, facturatie
3) HL7 v3 RIM
EHR repository: medische gegevens
-8-
Waarom HL7 v3 RIM 1) Action based modeling
Peirce, Davidson (en vele anderen) Act en ActRelationship is een Kripke structuur, een onder diverse namen veel voorkomende structuur in de wiskundige logica, waarover veel kennis beschikbaar is
2) Informatie geanalyseerd tot elementaire eenheden
geeft transparantie, handig voor queries
3) Incorporeert vele manjaren kennis en harmonization
HL7 v3 is 'hot', tientallen mails op lists per dag -9-
Ons voorbeeld: RIM DB van NEDSS 1) National Electronis Disease Surveillance System
http://www.cdc.gov/nedss/
2) Hiërarchie
6 basis classes zijn tabellen, plus een paar belangrijke specialisaties zoals substance administration en observation
3) Datatypes
Database types (numeric, varchar, date) Sommige composite types als tabel (address, id) GTS als varchar - 10 -
Portavita Antistolling 2004 1) We hebben een database schema, hoe nu verder? 2) Breng ordening aan in CDM applicatie
Focal act: Care Provision (PCPR) Link OBS, SBADM, ENC, PROC, etc acts aan PCPR
3) Ideëen uit antistolling later gebruikt als input voor HL7 Care Provision domein
- 11 -
Portavita Multidisciplinair 2005 - nu 1) Extra functionaliteit
CVA (2005) Diabetes (2006)
2) Veel (50+) soorten observaties, multidisciplinair 3) www.zorginformatiemodel.nl ➢
Ook bekend als Detailed Clinical Model (DCM) en template
- 12 -
Conclusie ontwikkelfilosofie Pv V2 Door het gebruik van het informatiemodel van HL7 v3 RIM, hebben we: 1) na 4 jaar nog steeds een samenhangend schema, ondanks honderden functionele updates gemaakt door een tiental programmeurs 2) uitgebreide documentatie van ons informatiemodel, waarmee we snel nieuwe programmeurs kunnen opleiden 3) een toekomstbestendig database schema; de applicaties voor CVA en Diabetes zijn met minimale wijzigingen aan het database schema toegevoegd
- 13 -
Architectuur en techniek 1) Een kijkje achter de schermen van de architectuur
Server roles Platform generaties
2) Techniek
Ons grote voorbeeld is geweest het NEDSS. Op de website van NEDSS http://www.cdc.gov/nedss is veel informatie te vinden. Wat hebben wij onder andere toegevoegd: methode voor implementatie constraints
- 14 -
Portavita V2 architectuur server roles 1) Database server
Datalaag Triggers (hiërarchie en constraints) Applicatielaag
2) Web server
Presentatielaag
3) Communicatie server
Lab- en HIS communicatie
4) Management server
- 15 -
Portavita V2 platform 1) 1e generatie V2 platform
Oct 2004 tot dec 2006
2) 2e generatie platform
Vanaf december 2006 Plaatje rechts: development stack 120 U320 scsi disks 8,7 TB total space
3) 3e generatie platform
Portavita Medical Grid - 16 -
Portavita RIM database statistieken 1) Januari 2008
Records: >358 miljoen Datafiles: 66,5 gigabyte IOps (met cache): 230.000 Queries p second: >500
- 17 -
Conclusie performance RIM database Het HL7 v3 RIM informatiemodel is geschikt voor databases met miljoenen records 1)RIM databases kunnen groot worden en toch blijven performen 2)De database server kan in principe elke vraag snel beantwoorden, mits de query 'goede SQL' is. Queries voor interactieve schermen (meestal single patient dus zoeken op ID) gaan in de orde van milliseconden
- 18 -
Techniek: constraints in Portavita V2 1) Wat is een constraint?
Een uitdrukking of expressie, die iets zegt over gegevens, die altijd waar moet zijn Constraints beperken wat je kan invoeren op schermen of in een database tot dingen die kunnen
2) Formele methoden
Wat is een formele methode? Zo exact als mogelijk een specificatie (van bijvoorbeeld software, een protocol of een constraint) uitdrukken en implementeren Waarom zou je dat willen? Je wilt geen ruimte voor interpretatiefouten - 19 -
Portavita V2 constraint methode 1) Definieer constraint in natuurlijke taal
Dit is in HL7- en implementatie-onafhankelijke termen
2) Vertaal naar expressie in formele taal
Tevens introductie HL7 termen (class- en typecodes)
3) Zoek naar tegenvoorbeeld: negatie van expressie
Want dan moet een melding komen
4) Vertaal negatie van expressie naar SQL 5) Bepaal triggermomenten voor SQL query - 20 -
Voorbeeld glucosecurve 1/2 Glucosecurve
Toelichting laag
- 21 -
Voorbeeld glucosecurve 2/2 Glucosecurve
Toelichting hoog
Toelichting laag
- 22 -
Gluc.curv. constraints natuurlijke taal 1) Een glucosecurve bestaat uit 8 glucosemetingen op vaste momenten:
nuchter, na ontbijt, voor lunch, na lunch, voor avondeten, na avondeten, voor slapengaan, nacht.
2) Er moet tenminste 1 meting worden gedaan 3) Wanneer er extreem lage glucosewaarden (kleiner dan 3,5) in de glucosecurve voorkomen en de patient heeft zelf gemeten, dan moet de extreemste waarde een toelichting hebben 4) Dito voor de hoogste waarde indien > 12 (Let op: geen HL7- of implementatie termen) - 23 -
Twee formele talen in gebruik 1) De Object-Z specificatie taal
Eerste orde logica Nadeel: met de hand act source en target id's aan elkaar knopen (net als in SQL)
2) Een eerste orde modale taal
Zie A modal logic of HL7 De pijl voor een attribuutnaam is om aan te geven dat de waarde van het attribuut bedoeld wordt Modale operatoren zoals
en [COMP] voor 'navigatie' over actRelationships, dus niet meer met de hand id's koppelen. (expressie) – is waar voor acts die tenminste één COMP-gerelateerde act hebben waar 'expressie' waar is. (iets is bv. ↓code=Portavita174) [COMP](expressie) – is waar voor acts die in alle COMPgerelateerde acts 'expressie' waar hebben. - 24 -
Cons 1: Vertaling naar formele taal 1) Natuurlijke taal constraints
Een glucosecurve bestaat uit 8 glucosemetingen op vaste momenten Er moet tenminste 1 meting worden gedaan
2) Vertaling
In HL7 termen is de glucosecurve een organizer (code Portavita174) en de 8 glucosemetingen zijn observaties (code Portavita175 tot Portavita182). Alleen bij daadwerkelijke metingen is een component verplicht (EVN), bij APT of RQO hoeft dat niet. ↓code=Portavita174 → [COMP](↓code = Portavita175 OR, ..., OR ↓code = Portavita182) (↓code=Portavita174 AND ↓moodCode=EVN) → (Τrue)
- 25 -
Cons 1: Vertaling naar SQL 2) Vertaling (vervolg)
Acts met codes Portavita175 tot Portavita182 hebben precies één source act met code Portavita174, waar ze COMP gerelateerd aan zijn. Ze zijn niet gerelateerd aan andere source acts. (↓code = Portavita175 OR, ..., OR ↓code = Portavita182) → (◊1-1(↓code=Portavita174) AND [COMP]-1(↓code=Portavita174)) (◊ betekent er is een typecode 'code' zodat ) (◊-1 is als ◊ maar dan met source en target omgewisseld: je zegt iets over source acts ipv targets) (◊1 betekent 'er is precies 1 target act' en kort voor (◊(↓id=x) and ◊(↓id=y) → x=y))
3) Negatie voor tegenvoorbeeld
(alleen eerste formule vorige pagina)
↓code=Portavita174 AND (↓code≠Portavita175 AND, ..., AND ↓code≠Portavita182)
4) Vertalen naar SQL SELECT id FROM acts a WHERE cd='Portavita174' INTERSECT SELECT act_id_source FROM act_relationships b, acts c WHERE b.act_id_target = c.id AND b.type_cd = 'COMP' AND c.cd NOT IN ('Portavita175', 'Portavita176', 'Portavita177', 'Portavita178', 'Portavita179', 'Portavita180', 'Portavita181', 'Portavita182')
- 26 -
Cons 2: Vertaling naar formele taal 1) Natuurlijke taal constraint
Wanneer er extreem lage glucosewaarden (< 3,5 mmol/l) in de glucosecurve voorkomen en de patient heeft zelf gemeten, dan moet de extreemste waarde een toelichting hebben Met andere woorden: als een glucosewaarde lager is dan 3,5 mmol/l en de patient heeft zelf gemeten, dan is er OF een toelichting gegeven, OF er is een nog lagere waarde in de glucose curve.
2) Vertaling naar formele taal
Maak gebruik van 'lambda abstraction'/'predicate abstraction' voor het predikaat 'Een COMP-target van de source act heeft een id anders dan x en een waarde lager dan y ' ((↓code = Portavita175 OR, ..., OR ↓code = Portavita182) AND ↓value<3.5 AND ↓SBJ=↓ENT) → ((↓code = Portavita183) XOR 〈λx,y.◊-1((↓id≠x AND ↓value
Cons 2: Negatie 3) Negatie voor tegenvoorbeeld
((↓code = Portavita175 OR, ..., OR ↓code = Portavita182) AND ↓value<3.5 AND ↓SBJ=↓ENT) AND ((↓code = Portavita183) ↔ 〈λx,y.◊-1((↓id≠x AND ↓value
4) Volgende pagina: vertalen naar SQL ➢ ➢
➢
➢
Opm 1: niet schrikken Opm 2: als je SQL server de IFF op booleans ondersteunt is de query de helft zo groot (dit is dus de '=' operator op booleans) Opm 3: ook al ziet de query er ingewikkeld uit, het gaat erom dat het in SQL, dus declaratief (zoals in de natuurlijke taal constraint), uit te drukken is Opm 4: deze constraint heeft een alternatieve implementatie met gebruik van min() en max() aggregates. Omdat functies van sets naar nummers niet in de modale logica beschreven zijn, heb ik daar ook geen gebruik van gemaakt in de SQL vertaling - 28 -
Cons 2: Vertalen naar SQL 4) Vertalen naar SQL
↔ vertaald als (a and b) or (not a and not b)
select r3.act_id_source from act_relationships r3, acts a1 where a1.ID = r3.act_id_source and a1.SBJ_PTCP_ID = (select role_id from participations p1 where p1.act_id=a1.id and p1.type_cd='ENT') and r3.act_id_target in (select o1.obse_act_id from obs_value_numeric o1 where o1.cd IN ('Portavita175', 'Portavita176', 'Portavita177', 'Portavita178', 'Portavita179', 'Portavita180', 'Portavita181', 'Portavita182') and o1.numeric_value_1 < 3.5 and ((exists (select b.act_id_source from act_relationships b, acts c where b.act_id_source = o1.obse_act_id and c.id=b.act_id_target and c.cd='Portavita183') and exists (select p.act_id_target from act_relationships p, act_relationships s, obs_value_numeric o2 where p.act_id_target = o1.obse_act_id and p.act_id_source = s.act_id_source and s.act_id_target = o2.obse_act_id and o2.obse_act_id<>o1.obse_act_id and o2.numeric_value_1o1.obse_act_id and o2.numeric_value_1
- 29 -
Ervaring met constraint methode 1) Methode werkt
Al diverse bugs (verkeerde inserts in database) voorkomen Performance goed door optimalisatie veel voorkomende 'structural constraints'
2) Formele methoden zijn lastig
Formele expressies niet geimplementeerd met computertaal dus niet getest -> todo Motivatie software engineers 'waarom niet gewoon direct in SQL?' Motivatie marketing 'waarom constraints maken als die tijd ook aan nieuwe functionaliteit besteed kan worden?' - 30 -
Samengevat 1) Door het HL7v3 RIM informatiemodel is de architectuur van het Portavita Multidisciplinair EPD toekomstbestendig 2) De database van Portavita Multidisciplinair EPD is een bewijs dat RIM databases groot kunnen zijn zonder performance problemen 3) De Act en ActRelationship Kripke structuur leent zich goed voor beschrijven met formele methoden op basis van modale logica
- 31 -
Toekomstplannen 1) Uitbouwen Portavita Multidisciplinair EPD
COPD Hartfalen
2) Techniek
Platslaan hiërarchie Automatiseren constraint methode Meer HL7 richting database datatypes en operatoren daarop (zoals GTS en in, during, before, overlaps etc) programmeren in PostgreSQL
Portavita Medical Grid
3) Kom bij ons werken! ➢ http://www.portavita.nl/bedrijf/vacature.html - 32 -