15:59:58 RRSAgent has joined #hcls 15:59:58 logging to http://www.w3.org/2016/03/01-hcls-irc 16:00:00 RRSAgent, make logs world 16:00:00 Zakim has joined #hcls 16:00:02 Zakim, this will be HCLS 16:00:02 I do not see a conference matching that name scheduled within the next hour, trackbot 16:00:03 Meeting: Semantic Web Health Care and Life Sciences Interest Group Teleconference 16:00:03 Date: 01 March 2016 16:00:05 Chair: David Booth 16:00:57 Agenda: http://wiki.hl7.org/index.php?title=ITS_RDF_ConCall_Agenda#DRAFT_Agenda_for_San_Antonio_Face-to-Face_Meetings 16:02:14 Sajjad has joined #hcls 16:02:56 Tony has joined #HCLS 16:05:59 Topic: FHIR RDF (Turtle) examples on HL7 github 16:06:00 https://hl7-fhir.github.io/allergyintolerance-example.ttl.html 16:12:47 Tony: _:example needs to be a named individual, because you cannot form reference to it. 16:13:39 eric: Could use inverse functional properties, but that's a pain and we would not be taking advantage of URIs. 16:14:20 lloyd: We can do that some of the times, but there are circumstances when resources will not have identifiers. When you do a POST it has no identity. The server gives you back a URI for it. 16:16:17 ACTION: Tony to try loading grahame's AllergyIntoloerance example (with _:example bnode root) in protege 16:16:17 Error finding 'Tony'. You can review and register nicknames at . 16:17:16 eric: should use the same root node in RDF as is used in FHIR XML or JSON 16:20:47 hsoblrig has joined #hcls 16:28:23 lloyd: in fhir:AllergyIntolerance.substance grahame has added ' a sct:227493005;', but that's not always going to be on the wire. 16:29:48 ... grahame added it on some of the properties, but not all of them. 16:31:03 tony: the type code gets applied to AllergyIntolerance (type becomes Confirmed) 16:31:54 lloyd: sct:227493005 is a property of the AllergyIntolerance -- not a type of it. 16:32:29 ... Otherwise if there were both previousStatus and a different (current) status, they both of those types would be applied to AllergyIntolerance 16:32:45 ... Concept cannot exist independent of code 16:32:56 ... And VS is a set of codes that imply concepts. 16:33:55 tony: present and previous status, when applied to the concept structures, the concepts are distinct. 16:35:34 eric: elevating the type to the subject of the property does not work (e.g., currentlyConfirmed vs currentlySuspected). 16:36:11 ... But we could say that there's a set of properties, the concepts of which we can apply directly to the subjects. 16:36:37 ... Do you want to say that this house is a member of the class RedHouses or do you want to say that it has an attribute of red? 16:37:19 lloyd: The concept appears at two levels -- coding and codeableCOncept. 16:37:55 .. We started from everything being turned into a codeableConcept. What grahame has said is that concepts appear at both levels, but I think that will cause us grief, but we'll see. 16:38:22 ... The binding ont from snomed to FHIR, it needs to know where to apply it. 16:38:38 tony: Yes, you really need to know the object property 16:39:19 lloyd: Can we come up with the ont that will enable that inference, that substance is an sct:227493005 and the coding is an sct:227493005 ? 16:39:50 tony: The big thing is the disjoint declarations that we had. We'll have to take those out, because now we'll have codes that are also concepts. 16:43:13 dbooth: The snomed types that grahame has added, such as ' a sct:227493005;', will not always be there, so we cannot count on it for round tripping. It is misleading to have them there. 16:43:36 lloyd: Instances will not necessarily have these present, but if present they should be round tripped in the JSON or XML. 16:44:10 ... In many cases they will not be there. But now they're present in order to test something, but should also appear everywhere. 16:44:22 ... Once we have completed our tests they can be dropped. 16:44:38 rob: How do deal with multiple codings? 16:45:00 lloyd: multiple concept assertions 16:45:31 harold: re everything having coding, at the moment we do not have a concept identifier for foo. Is there a proposal for getting that in? 16:45:38 s/foo/food/ 16:45:58 lloyd: What is the concept code for food? We need one, but don't have one yet. 16:46:25 harold: Where is the equivalent of fhir:food (corresponding to snomed code)? 16:46:58 ... How does the target of the category rdf:type fhir:food get there? 16:47:31 lloyd: The transform happens based on ont knowledge, fixed value from a VS, implies food concept. 16:47:36 harold: Then why not for substance? 16:47:51 lloyd: For substance we don't have a fixed binding. 16:48:02 ... Substance could draw from 20 other code systems. 16:48:14 ... Also because it is not a fixed binding, it needs to draw from both. 16:49:18 lloyd: Right now we're asserting the concept for substance, but we need to (temporarily for testing) for status, criticality, etc. just like for substance. 16:50:42 let's get specific: https://docs.google.com/document/d/1XfktjntceKY4zDTmklkQTWuFbWC3tSY39Xh72Rl64hg/edit 16:55:36 changing fhir:AllergyIntolerance.status to: 16:55:37 [[ 16:55:38 fhir:AllergyIntolerance.status [ 16:55:38 a fhir:CodeSystem\/AllergyIntoleranceStatus\#confirmed ; 16:55:38 fhir:value "confirmed" 16:55:38 ]; 16:55:39 ]] 17:04:00 Topic: 5pm call 17:04:06 We'll do one :) 17:10:55 Present: David Booth, EricP, Harold Solbrig, Lloyd McKenzie, Rob Hausam, Sajjad Hussain, Tony Mallia 17:11:01 rrsagent, draft minutes 17:11:01 I have made the request to generate http://www.w3.org/2016/03/01-hcls-minutes.html dbooth 19:53:16 Zakim has left #hcls 22:10:34 Topic: ============== 5pm Call ================== 22:12:34 Topic: Example FHIR RDF (Turtle) 22:14:28 lloyd: fhir:AllergyIntolerance.recorder is declared as a fhir:Reference . Doesn't need to be declared. 22:17:32 lloyd: What about having the fhir:REference.reference include an actual URI of the thing that is referenced? 22:17:40 dbooth: Can it always have a URI? 22:18:15 lloyd: sort of. 22:18:26 dbooth: what about when you're POSTing and you have an internal reference? 22:18:42 lloyd: then it's relative to the server to which you're posting. 22:19:21 eric: An XML FHIR app will see a ref to Practitioner/example and take its own base URL and resolve that ref as ../Practitioner/example? 22:19:23 lloyd: Yes 22:19:38 ... it would prepend the base URL and go from there. 22:20:23 ... The tricky piece is that these are not true relative URLs. there's some magic, but if you adhere to the magic it works. 22:20:34 eric: Can we emulate that magic on the RDF side? 22:21:03 dbooth: Will there *always* be a URI available? 22:21:34 lloyd: Will there always be a URI? yes. Will it alwasy be available to the translation process? IDK. It would require that knowledge to be injected into the conversion process. 22:21:50 eric: Any XML tool traversing the ref would need the URI? 22:22:21 lloyd: Yes. If you're doing a POST, and the recipient checks, it would look for baseUri/Patient/example to see if that exists. 22:22:49 ... The client is aware that the patient exists on the same server where the allergyIntolerance is being posted. 22:23:15 eric: So if we say that the translation process has the same burden, then we can do that, because JSON and XML will need to do that anyway? 22:23:49 lloyd: The info will be available to the systems, but not necessarily to the module doing the translation. You may need to pass that info in through several layers. 22:24:04 ... From an ont perspective not having the link produces not useful data. 22:24:41 ... Without an expilcit ref to the patient, then finding the meds prescribed to the patient will be much more awkward for RDF types to write. 22:25:02 eric: You would have logic into the SPARQL: the logic of URI resolution. 22:25:44 ... If I say waht are all the med orders for this patient, it would have to figure out the ways to write down the ref to that patient. 22:26:46 lloyd: Instead of querying for meds for patient xyz, you have to query for a patient with a property with a string "xyz" OR . . . the various other ways of identifying the patient. 22:28:03 dbooth: Instead of using a URI for the patient, you would use one or more property paths? 22:28:15 lloyd: yes. 22:30:00 lloyd: the fhir:value of fhir:Reference.reference could be "Patient/example" or "http://example.org/fhir/Patient/example" 22:30:13 eric: Equivalence between http: and https: ? 22:30:28 lloyd: It was discussed, but don't know where it is document. 22:30:55 ... Yes, they refer to the same object. 22:32:08 ... But if you put a non-default port number on then it is different. 22:33:55 dbooth: Will there always be a URI 22:34:06 lloyd: There will always be a base, but not in the document. 22:34:07 rhausam has joined #HCLS 22:34:42 dbooth: If you're doing a POST, and you have not posted, you dont' know the base? 22:35:03 lloyd: if it's in memory and you haven't decided where to send it, then yes. 22:36:19 lloyd: The base URI does not exist inside the instance, but resources frequently know what their base is. 22:37:02 ... My inclination is to allow the URI to be optionally included in the instance. 22:37:40 Topic: Root URI 22:38:27 lloyd: Base URI will never appear inside the doc. 22:39:03 ... But if the doc lives on a server, then the server exposing that doc is aware of that base URI. 22:39:28 dbooth: And could sometimes include the URI in the doc? 22:40:12 lloyd: Could calculate absolute URIs for embedding in the doc. 22:40:25 ... My preference is to say that this is permitted but not required. 22:40:53 ... So transforms to RDF, XML or JSON could use an extension to keep that info if it's available. 22:41:32 dbooth: Trying to zero in on what we can ALWAYS count on. 22:42:20 lloyd: Cannot always count on an absolute URI in the doc. 22:42:45 dbooth: We need to figure out how to deal with that in RDF, because RDF uses *only* absolute URIs. 22:43:52 lloyd: Could use a post-processing step that would take the base URI to generate absolute URIs from properties. 22:45:15 dbooth: That sounds like it pushes us toward not requiring URIs in the RDF document. 22:48:33 eric: I haven't given up yet. I hope we can have the baseUri available. 22:48:50 ... I also want to try leveraging Turtle's relative URIs. 22:49:37 lloyd: But for servers that don't care about RDF that use ref implementations might not want to be bothered to pass in the baseUri. 22:52:04 Topic: How to represent literals in Turtle 22:52:05 lloyd: In RDF, should things like dates be expressed as strings in turtle or not? 22:52:27 eric: Turtle literals are written as "foo"^^theType 22:52:47 ... So things like fhir:datetype can just be written that way. 22:53:58 dbooth: Could write "2012-06"^^fhir:datetype 22:54:34 lloyd: JSON people would not know or care if the date is xsd:date or xsd:datetype 22:54:59 eric: when using the JSON, you have to parse as all three and see which worked? 22:56:26 s/datetype/datetime/ 22:56:38 s/datetype/datetime/ 22:57:51 eric: I would prefer that the translator tries to parse the value all three ways, and then tag it with the type that worked. 23:03:24 dbooth: Query would either have to use: (a) a regex vs a datatype for all three types; and (b) cast all three to use them together. 23:04:54 ISSUE: How to represent fhir:datetime values? Three different types? Plain xsd:strings? 23:04:54 Created ISSUE-20 - How to represent fhir:datetime values? three different types? plain xsd:strings?. Please complete additional details at . 23:06:43 ADJOURNED 23:16:47 qualifiedBy 23:30:05 Topic: How to represent FHIR dateTime values in RDF? 23:31:02 Present+ EricP, David Booth, Lloyd McKenzie, Rob Hausam, Thomas Lukasik 23:42:38 [[ 23:42:39 # fhir:dateTime is union of xs:dateTime, xs:date, xs:gYearMonth, xs:gYear 23:42:39 # 23:42:39 ######################################################### 23:42:39 # If FHIR RDF literals are tagged with separate FHIR dateTime datatypes, 23:42:40 # filters would look like this: 23:42:41 FILTER ( datatype(?lastOccurence) = xsd:gYear ) 23:42:43 FILTER ( datatype(?lastOccurence) = xsd:gYearMonth ) 23:42:45 FILTER ( datatype(?lastOccurence) = xsd:date ) 23:42:47 FILTER ( datatype(?lastOccurence) = xsd:dateTime ) 23:42:49 ######################################################### 23:42:51 # If FHIR RDF literals are xsd:strings , 23:42:53 # filters would look like this: 23:42:57 FILTER regex(?lastOccurence, 23:42:59 "^[0-9]{4}$") # YYYY 23:43:01 FILTER regex(?lastOccurence, 23:43:03 "^[0-9]{4}\-[0-9]{2}$") # YYYY-MM 23:43:05 FILTER regex(?lastOccurence, 23:43:07 "^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$") # YYYY-MM-DD 23:43:09 FILTER regex(?lastOccurence, 23:43:11 "^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T") # YYYY-MM-DDThh:mm:ss 23:43:13 ######################################################### 23:43:15 # In both cases, the value would have to be converted in order 23:43:17 # to compare it to another FHIR dateTime value: 23:43:19 FILTER ( f:toDateTime(?lastOccurence) < ?someDateTime ) 23:43:21 ]] 23:50:15 eric: But xpath knows how to do datetime type conversions. 23:50:24 dbooth: Okay, so here's my updated comparison: 23:50:25 [[ 23:50:32 # fhir:dateTime is union of xs:dateTime, xs:date, xs:gYearMonth, xs:gYear 23:50:32 # 23:50:32 ######################################################### 23:50:32 # If FHIR RDF literals are tagged with separate FHIR dateTime datatypes, 23:50:33 # filters would look like this: 23:50:33 FILTER ( datatype(?lastOccurence) = xsd:gYear ) 23:50:35 FILTER ( datatype(?lastOccurence) = xsd:gYearMonth ) 23:50:37 FILTER ( datatype(?lastOccurence) = xsd:date ) 23:50:39 FILTER ( datatype(?lastOccurence) = xsd:dateTime ) 23:50:41 # XPath knows how to convert between the different datetime 23:50:43 # representations 23:50:45 # https://www.w3.org/TR/xpath-functions/#casting-from-primitive-to-primitive 23:50:47 # so comparison can be done without an explicit conversion: 23:50:49 FILTER ( ?lastOccurence < ?someDateTime ) 23:50:51 ######################################################### 23:50:53 # If FHIR RDF literals are xsd:strings , 23:50:56 # filters would look like this: 23:50:59 FILTER regex(?lastOccurence, 23:51:01 "^[0-9]{4}$") # YYYY 23:51:03 FILTER regex(?lastOccurence, 23:51:05 "^[0-9]{4}\-[0-9]{2}$") # YYYY-MM 23:51:07 FILTER regex(?lastOccurence, 23:51:09 "^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$") # YYYY-MM-DD 23:51:11 FILTER regex(?lastOccurence, 23:51:13 "^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T") # YYYY-MM-DDThh:mm:ss 23:51:15 # To compare it to another FHIR dateTime value: 23:51:17 FILTER ( f:toDateTime(?lastOccurence) < ?someDateTime ) 23:51:19 ]] 23:51:21 eric: Many more queries will be done than translations 23:51:38 ADJOURNED AGAIN :) 23:51:55 ericP: many more queris written than translators implemented 23:51:57 rrsagent, draft minutes 23:51:57 I have made the request to generate http://www.w3.org/2016/03/01-hcls-minutes.html dbooth