- From: Josh Mandel <Joshua.Mandel@childrens.harvard.edu>
- Date: Thu, 26 Feb 2015 15:18:53 -0800
- To: Jim McCusker <mccusj@rpi.edu>
- Cc: David Booth <david@dbooth.org>, "public-linked-json@w3.org" <public-linked-json@w3.org>, Manu Sporny <msporny@digitalbazaar.com>, Markus Lanthaler <markus.lanthaler@gmx.net>, Pat Hayes <phayes@ihmc.us>
- Message-ID: <CANSMLKF4=DPU=dopSg6nez6NVH3-+nonSCXTn7Wy3SoNxijEKA@mail.gmail.com>
One quick note: order matters within FHIR JSON arrays, so if you need to
support round-trips, you'd also want to add {"@container":"@list"} to your
context for every property that allows multiple cardinality.
On Thu, Feb 26, 2015 at 2:41 PM, Jim McCusker <mccusj@rpi.edu> wrote:
> Blank node IDs are only significant in RDF if they are objects of more
> than one statement. The two graphs you show above are semantically
> equivalent, so you should be fine omitting the @id. I would check to see if
> there are any edge cases where blank nodes might be referred to twice, but
> based on the original serialization in FRIR, that seems unlikely
> (especially since JSON is a tree).
>
> Jim
>
> On Thu Feb 26 2015 at 3:35:20 PM David Booth <david@dbooth.org> wrote:
>
>> On 02/25/2015 10:11 AM, Manu Sporny wrote:
>> > So, count us in - send the questions to the mailing list and it looks
>> > like you have multiple community members that would be willing to help
>> out.
>>
>> Thanks Manu (and Markus and Jim and any others)! Okay, my first
>> question regards blank nodes.
>>
>> Here is an except of a FHIR JSON data:
>>
>> {
>> "dob": "1972-11-30",
>> "_dob": {
>> "id": "314159",
>> "extension": [{
>> "url" : "http://example.org/fhir/extensions#text
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example.org_fhir_extensions-23text&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=v2-wOqi3M9X7-KyOF79RsqMm6dAJTXaxN3zBuJ8_YBo&e=>
>> ",
>> "valueString" : "Easter 1970"
>> }]
>> }
>>
>> To turn this into JSON-LD, I've created an @context:
>>
>> {
>> "@context":
>> {
>> "@vocab": "http://example/fhir/vocab#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=FqkUWPFwgp5vHwj6ndnm9tXnf0kAV_c_R2braWjY5VI&e=>
>> ",
>> "fhir": "http://example/fhir#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=44EoZLooeCSOW3bMtRWsiClgUASN712lqm52Rw-wu8Q&e=>
>> ",
>> "xsd": "http://www.w3.org/2001/XMLSchema#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__www.w3.org_2001_XMLSchema-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=obVE-Xv77VHSs7JnAymzMxL2zy0-UzuTwxEV7-jEPGw&e=>
>> ",
>> "dob":
>> {
>> "@id": "fhir:dob",
>> "@type": "xsd:date"
>> },
>> "_dob":
>> {
>> "@id": "fhir:_dob",
>> "@type": "@id"
>> }
>> }
>> }
>>
>> and I've linked it from the FHIR JSON document (thus involving a single,
>> constant, one-line change to the existing format). Here is the
>> resulting JSON-LD, with three # comments added for reference later:
>>
>> { # _:b0
>> "@context": "http://dbooth.org/2015/fhir/json-ld/dob-context.jsonld
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__dbooth.org_2015_fhir_json-2Dld_dob-2Dcontext.jsonld&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=E81eCUULmJadDJO2uHeEZiPIiNpxYd0Hr7xjtDaXLog&e=>
>> ",
>> "dob": "1972-11-30",
>> "_dob": { # _:b1
>> "id": "314159",
>> "extension": [{ # _:b2
>> "url" : "http://example.org/fhir/extensions#text
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example.org_fhir_extensions-23text&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=v2-wOqi3M9X7-KyOF79RsqMm6dAJTXaxN3zBuJ8_YBo&e=>
>> ",
>> "valueString" : "Easter 1970"
>> }]
>> }
>>
>> As you can see, none of the JSON objects above has been given an @id, so
>> when this is interpreted as RDF, blank nodes (_:b0, _:b1, _:b2) are
>> generated to represent those unidentified objects. Here is the RDF
>> interpretation in Turtle:
>>
>> @prefix fhir: <http://example/fhir#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=44EoZLooeCSOW3bMtRWsiClgUASN712lqm52Rw-wu8Q&e=>>
>> .
>> @prefix xsd: <http://www.w3.org/2001/XMLSchema#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__www.w3.org_2001_XMLSchema-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=obVE-Xv77VHSs7JnAymzMxL2zy0-UzuTwxEV7-jEPGw&e=>>
>> .
>>
>> _:b0 fhir:_dob _:b1 ;
>> fhir:dob "1972-11-30"^^xsd:date .
>>
>> _:b1 <http://example/fhir/vocab#extension
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23extension&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=iIY9cW0yRcF3shc1ydJ4xDEfzUghVtwawiskRULZX0k&e=>>
>> _:b2 ;
>> <http://example/fhir/vocab#id
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23id&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=njZfZM2P8qG1p-cxeDuEi6AuQoDEMEJhXGCSXwvj8os&e=>>
>> "314159" .
>>
>> _:b2 <http://example/fhir/vocab#url
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23url&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=GPeA354Va1jkpeQFE752CLXZBiUot0q4acRdZj_cxH4&e=>
>> >
>> "http://example.org/fhir/extensions#text
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example.org_fhir_extensions-23text&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=v2-wOqi3M9X7-KyOF79RsqMm6dAJTXaxN3zBuJ8_YBo&e=>"
>> ;
>> <http://example/fhir/vocab#valueString
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23valueString&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=0mV9key2_nwDiyT9LSr_hclTg69sdl8udFV_PPzN5M8&e=>
>> >
>> "Easter 1970" .
>>
>> One of the key requirements is for FHIR data to be round-trippable
>> between the different data representations, such as XML and JSON. This
>> means that if we interpret some given FHIR JSON-LD data as RDF, we need
>> to be able to serialize from RDF back to the *same* JSON-LD. Here is
>> the result after serializing the above Turtle back into JSON-LD (using
>> jena riot), with line numbers added for reference:
>>
>> 1. {
>> 2. "@context": {
>> 3. "fhir": "http://example/fhir#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=44EoZLooeCSOW3bMtRWsiClgUASN712lqm52Rw-wu8Q&e=>
>> ",
>> 4. "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__www.w3.org_1999_02_22-2Drdf-2Dsyntax-2Dns-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=1iTn8oAnsMWdsZra3QiQbxnFCg3BX9MhKc1AakAAiMQ&e=>
>> ",
>> 5. "rdfs": "http://www.w3.org/2000/01/rdf-schema#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__www.w3.org_2000_01_rdf-2Dschema-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=QB9OyblS_wpupoBsjjr9WamQxGXa6cMcF6ymV1IzNlc&e=>
>> ",
>> 6. "xsd": "http://www.w3.org/2001/XMLSchema#
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__www.w3.org_2001_XMLSchema-23&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=obVE-Xv77VHSs7JnAymzMxL2zy0-UzuTwxEV7-jEPGw&e=>
>> "
>> 7. },
>> 8. "@graph": [
>> 9. {
>> 10. "@id": "_:fc7725329340449efa72b6f7f5d7182eeb3",
>> 11. "http://example/fhir/vocab#url
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23url&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=GPeA354Va1jkpeQFE752CLXZBiUot0q4acRdZj_cxH4&e=>
>> ":
>> "http://example.org/fhir/extensions#text
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example.org_fhir_extensions-23text&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=v2-wOqi3M9X7-KyOF79RsqMm6dAJTXaxN3zBuJ8_YBo&e=>
>> ",
>> 12. "http://example/fhir/vocab#valueString
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23valueString&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=0mV9key2_nwDiyT9LSr_hclTg69sdl8udFV_PPzN5M8&e=>":
>> "Easter 1970"
>> 13. },
>> 14. {
>> 15. "@id": "_:fc7725329340449efa72b6f7f5d7182eeb2",
>> 16. "http://example/fhir/vocab#extension
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23extension&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=iIY9cW0yRcF3shc1ydJ4xDEfzUghVtwawiskRULZX0k&e=>":
>> {
>> 17. "@id": "_:fc7725329340449efa72b6f7f5d7182eeb3"
>> 18. },
>> 19. "http://example/fhir/vocab#id
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23id&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=njZfZM2P8qG1p-cxeDuEi6AuQoDEMEJhXGCSXwvj8os&e=>
>> ": "314159"
>>
>> 20. },
>> 21. {
>> 22. "@id": "_:fc7725329340449efa72b6f7f5d7182eeb1",
>> 23. "fhir:_dob": {
>> 24. "@id": "_:fc7725329340449efa72b6f7f5d7182eeb2"
>> 25. },
>> 26. "fhir:dob": {
>> 27. "@type": "xsd:date",
>> 28. "@value": "1972-11-30"
>> 29. }
>> 30. }
>> 31. ]
>> 32. }
>>
>> As you can see, there are several differences from the original JSON-LD,
>> which is not a surprise. I already know that a generic RDF JSON-LD
>> serializer will not suffice for this purpose -- a special purpose
>> FHIR-aware JSON-LD serializer will be needed -- but that's okay, because
>> FHIR already requires a special-purpose serializer for its existing JSON
>> format anyway. Some of the differences could be readily handled by a
>> special-purpose FHIR JSON-LD serializer (such as the outer @graph
>> wrapper and the embedded @context), but not all.
>>
>> In this message I want to focus specifically on the blank nodes, so for
>> the moment I'll ignore other differences. Blank node labels are
>> arbitrary in RDF, so they might be serialized differently by different
>> serializers or in different runs of the same serializer, so I had been
>> thinking that, to enable predictable round tripping, it may be best to
>> generate predictable URIs instead of using blank nodes. However, a
>> downside of this is that AFAIK it would require the FHIR JSON-LD
>> instance data -- not merely the @context -- to contain an explicit @id
>> property on every FHIR JSON-LD object. Is this correct? If so, FHIR
>> JSON users are likely to reject that option as too onerous, because most
>> of them don't care about RDF. If not, how would URIs be specified in
>> the @context for JSON-LD objects that have no explicit @ids?
>>
>> However, I am now thinking that it might be better to allow those
>> unidentified JSON-LD objects to become blank nodes in the RDF
>> interpretation, and instead have the FHIR-specific JSON-LD serializer
>> suppress them (if they are blank nodes). So instead of serializing a
>> bit of RDF as:
>>
>> {
>> "@id": "_:fc7725329340449efa72b6f7f5d7182eeb3",
>> "http://example/fhir/vocab#url
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23url&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=GPeA354Va1jkpeQFE752CLXZBiUot0q4acRdZj_cxH4&e=>
>> ":
>> "http://example.org/fhir/extensions#text
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example.org_fhir_extensions-23text&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=v2-wOqi3M9X7-KyOF79RsqMm6dAJTXaxN3zBuJ8_YBo&e=>
>> ",
>> "http://example/fhir/vocab#valueString
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23valueString&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=0mV9key2_nwDiyT9LSr_hclTg69sdl8udFV_PPzN5M8&e=>":
>> "Easter 1970"
>> },
>>
>> it would instead omit the @id property and serialize it as:
>>
>> {
>> "http://example/fhir/vocab#url
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23url&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=GPeA354Va1jkpeQFE752CLXZBiUot0q4acRdZj_cxH4&e=>
>> ":
>> "http://example.org/fhir/extensions#text
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example.org_fhir_extensions-23text&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=v2-wOqi3M9X7-KyOF79RsqMm6dAJTXaxN3zBuJ8_YBo&e=>
>> ",
>> "http://example/fhir/vocab#valueString
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__example_fhir_vocab-23valueString&d=BQMFaQ&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=c7b1QeR755-dBx2b0xnlepDTylromoEzcLl-6ixmBL3TpXSxSvtAvT553fzSgLpm&m=cwBQRtzGpJh6TOof7KR8AR7dd72k3x6hssmzw4HweFk&s=0mV9key2_nwDiyT9LSr_hclTg69sdl8udFV_PPzN5M8&e=>":
>> "Easter 1970"
>> },
>>
>> Does this seem like a good idea? Any hidden problems? Are there other
>> approaches that you think would be better?
>>
>> Thanks,
>> David
>>
>
Received on Thursday, 26 February 2015 23:19:42 UTC