C0SDEM ; GPL - Smart Demographics Processing ; 10/30/12 10:59am ;;1.0;VISTA SMART CONTAINER;;Sep 26, 2012;Build 5 ;Copyright 2012 George Lilly. ; ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU Affero General Public License as ; published by the Free Software Foundation, either version 3 of the ; License, or (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU Affero General Public License for more details. ; ; You should have received a copy of the GNU Affero General Public License ; along with this program. If not, see . ; Q ; ; ; ; ; ; ; ; Bob ; J ; Odenkirk ; ; ; ; ; ; ; ; ; 15 Main St ; Apt 2 ; Wonderland ; OZ ; 54321 ; USA ; ; ; ; ; ; ; ; 800-555-1212 ; ; ; ; ; ; ; 800-555-1515 ; ; ; ; male ; 1959-12-25 ; bob.odenkirk@example.com ; ; ; ; My Hospital Record 2304575 ; 2304575 ; My Hospital Record ; ; ; ; ; ; ; ; ; ; ; Bob ; J ; Odenkirk ; ; ; ; ; ; ; ; ; 15 Main St ; Apt 2 ; Wonderland ; OZ ; 54321 ; USA ; ; ; ; ; ; ; ; 800-555-1212 ; ; ; ; ; ; ; 800-555-1515 ; ; ; ; male ; 1959-12-25 ; bob.odenkirk@example.com ; ; ; ; My Hospital Record 2304575 ; 2304575 ; My Hospital Record ; ; ; ; ; ;G(1)="nodeID:25591^rdf:type^v:Home" ;G(2)="nodeID:25591^rdf:type^v:Pref" ;G(3)="nodeID:25591^rdf:type^v:Tel" ;G(4)="nodeID:25591^rdf:value^800-369-6403" ;G(5)="nodeID:25611^rdf:type^v:Name" ;G(6)="nodeID:25611^v:additional-name^N" ;G(7)="nodeID:25611^v:family-name^Brooks" ;G(8)="nodeID:25611^v:given-name^Brian" ;G(9)="nodeID:25622^dcterms:identifier^981968" ;G(10)="nodeID:25622^dcterms:title^My Hospital Record 981968" ;G(11)="nodeID:25622^rdf:type^sp:Code" ;G(12)="nodeID:25622^sp:system^My Hospital Record" ;G(13)="nodeID:25623^rdf:type^v:Address" ;G(14)="nodeID:25623^rdf:type^v:Home" ;G(15)="nodeID:25623^rdf:type^v:Pref" ;G(16)="nodeID:25623^v:locality^Bixby" ;G(17)="nodeID:25623^v:postal-code^74008" ;G(18)="nodeID:25623^v:region^OK" ;G(19)="nodeID:25623^v:street-address^82 Lake St" ;G(20)="smart:981968/demographics^foaf:gender^male" ;G(21)="smart:981968/demographics^rdf:type^sp:Demographics" ;G(22)="smart:981968/demographics^sp:belongsTo^smart:981968" ;G(23)="smart:981968/demographics^sp:medicalRecordNumber^nodeID:25622" ;G(24)="smart:981968/demographics^v:adr^nodeID:25623" ;G(25)="smart:981968/demographics^v:bday^1956-03-23" ;G(26)="smart:981968/demographics^v:email^brian.brooks@example.com" ;G(27)="smart:981968/demographics^v:n^nodeID:25611" ;G(28)="smart:981968/demographics^v:tel^nodeID:25591" Q ; PATIENT(GRTN,C0SARY) ; GRTN, passed by reference, ; is the return name of the graph created. "" if none ; C0SARY is passed in by reference and is the NHIN array of patient ; I $O(C0SARY("patient",""))="" D Q ; . I $D(DEBUG) W !,"No Patient array" . S GRTN="" S GRTN="" ; default to no patient N C0SGRF S C0SGRF="vistaSmart:"_ZPATID_"/patient" S ZPAT=C0SGRF ; subject is the same as the graph name I $D(DEBUG) W !,"Processing ",C0SGRF D DELGRAPH^C0XF2N(C0SGRF) ; delete the old graph D INITFARY^C0XF2N("C0XFARY") ; which triple store to use N FARY S FARY="C0XFARY" D USEFARY^C0XF2N(FARY) D VOCINIT^C0XUTIL ; N ZPN,ZR D STARTADD^C0XF2N ; ; First do the base demographic graph ; S ZPN=$NA(C0SARY("patient",1)) ; name of predicate array for this patient N SEX S SEX=$G(@ZPN@("gender@value")) I SEX="M" S SEX="male" I SEX="F" S SEX="female" S ZR("foaf:gender")=SEX S ZR("rdf:type")="sp:Demographics" S ZR("sp:belongsTo")=ZPAT N PATIENT S PATIENT=$P(ZPAT,"#",2) I $D(DEBUG) W !,"PROCESSING PATIENT ",PATIENT N NMREC S NMREC=$$ANONS^C0XF2N ; new anonomous subject for med rec graph S ZR("sp:medicalRecordNumber")=NMREC N NVADR S NVADR=$$ANONS^C0XF2N ; for address S ZR("v:adr")=NVADR N NNAME S NNAME=$$ANONS^C0XF2N ; for name S ZR("v:n")=NNAME N NTEL S NTEL=$$ANONS^C0XF2N ; for telephone I $D(@ZPN@("telecomList.telecom@value")) S ZR("v:tel")=NTEL ; only if exists N BDATE S ZX="" S ZX=$G(@ZPN@("dob@value")) ; date of birth in fileman format S BDATE=$$FMTE^XLFDT(ZX,"7D") ; ordered date S BDATE=$TR(BDATE,"/","-") ; change slashes to hyphens I BDATE="" S BDATE="UNKNOWN" N Z2,Z3 S Z2=$P(BDATE,"-",2) S Z3=$P(BDATE,"-",3) I $L(Z2)=1 S $P(BDATE,"-",2)="0"_Z2 I $L(Z3)=1 S $P(BDATE,"-",3)="0"_Z3 S ZR("v:bday")=BDATE I $D(C0SVISTA) D ; . S ZR("vista:SSN")=$G(@ZPN@("ssn@value")) ; SSN . S ZR("vista:DFN")=$G(@ZPN@("id@value")) ; DFN D ADDINN^C0XF2N(C0SGRF,ZPAT,.ZR) ; create base graph K ZR ; ; create address sub-graph ; S ZR("rdf:type")="v:Address" S ZR("rdf:type")="v:Home" S ZR("v:locality")=$G(@ZPN@("address@city")) S ZR("v:postal-code")=$G(@ZPN@("address@postalCode")) S ZR("v:region")=$G(@ZPN@("address@stateProvince")) S ZR("v:street-address")=$G(@ZPN@("address@streetLine1")) D ADDINN^C0XF2N(C0SGRF,NVADR,.ZR) ; create the vcard address K ZR ; ; create medical record subgraph ; S ZR("dcterms:identifier")=$G(@ZPN@("id@value")) S ZR("dcterms:title")="VistA Patient Record "_ZR("dcterms:identifier") S ZR("rdf:type")="sp:Code" S ZR("sp:system")="VistA Patient Record" D ADDINN^C0XF2N(C0SGRF,NMREC,.ZR) ; create medical record graph K ZR ; ; create name subgraph ; N ZNF,ZNL,ZNM,ZNAM S ZR("rdf:type")="v:Name" S ZX=$G(@ZPN@("givenNames@value")) ; first name and middle names S ZNF=$P(ZX," ",1) ; first name is first piece S ZNM=$P(ZX," ",2) ; middle names are the rest S ZR("v:additional-name")=ZNM S ZR("v:family-name")=$G(@ZPN@("familyName@value")) S ZR("v:given-name")=ZNF D ADDINN^C0XF2N(C0SGRF,NNAME,.ZR) ; insert name graph K ZR ; ; create telephone subgraph ; D ; . S ZR("rdf:value")=$G(@ZPN@("telecomList.telecom@value")) . I ZR("rdf:value")="" Q ; telephone number missing, no subgraph . S ZR("rdf:type")="v:Tel" . D ADDINN^C0XF2N(C0SGRF,NTEL,.ZR) K ZR ; ; load the demographics graph and all sub graphs to the triple store ; D BULKLOAD^C0XF2N(.C0XFDA) S GRTN=C0SGRF Q ; AGES ; LIST ALL PATIENTS AND THEIR AGES N ZI S ZI=0 F S ZI=$O(^DPT(ZI)) Q:+ZI=0 D ; FOR EVERY PATIENT . N ZDOB . S ZDOB=$$GET1^DIQ(2,ZI_",","DOB","I") ; FILEMAN DOB . N ZNAME . S ZNAME=$P(^DPT(ZI,0),U) . N ZSEX . S ZSEX=$$GET1^DIQ(2,ZI_",","SEX") . W !,"DFN:",ZI," ",ZNAME," AGE: ",+$$BRIEF^VWTIME(ZDOB)," YEAR OLD ",ZSEX Q ;