如何在Java中将JSON数组转换为RDF?
我想在Java中将JSON(而不是JSON-LD)数组转换为RDF。 我在论坛上看过类似的post,但不是确切的答案。 JSON数组包含对象和数组,如:
{ "results": [ { "record_id": "3d87f4df-f17e-4632-9449", "demographics": { "gender":"female", "race":"", "age":20 } }, { "record_id": "ec5ca92d-865a-431f-9984", "demographics": { "gender":"male", "age":118 } }, { "record_id": "0a79ecf0-83d8-4148-9054", "demographics": { "gender":"female", "age":118 } }, { "record_id": "229276f8-1893-480b-b6e7", "demographics": { "gender":"female", "age":35 } }, { "record_id": "0574cc3b-fb9c-495f-851c", "demographics": { "gender":"female", "age":40 } }, { "record_id": "f3ccfdf6-231e-4a3e-bee0", "demographics": { "gender":"male", "age":118 } } ] }
有任何想法吗? 感谢名单!
我建议你不要硬编码这种转换。
对于RDBMS源(顺便说一下,为什么不使用它们),有W3C标准化的R2RML ( r2rml )。
对于JSON和XML源,有RML ,R2RML的非官方扩展。
RML Mapper是RML的Java实现:
$ bin/RML-Mapper -m ~/Desktop/mappings.ttl -o ~/Desktop/results.ttl
通常,您应该在rml:logicalSource
部分中放置rml:iterator "$.results.[*]"
来迭代数组元素。 确切的答案取决于您要使用的词汇表以及您想要实现的数据模型。
我们假设你需要这样的东西:
@prefix exr: . @prefix exo: . exr:gender_female a exo:Gender ; rdfs:label "female" . exr:gender_male a exo:Gender ; rdfs:label "male" . exr:record_3d87f4df-f17e-4632-9449 a exo:Record ; exo:patient_age 20 ; exo:patient_gender exo:gender_female . exr:record_ec5ca92d-865a-431f-9984 a exo:Record ; exo:patient_age 118 ; exo:patient_gender exo:gender_male .
那么你的映射应该是:
@prefix rr: . @prefix rml: . @prefix ql: . @prefix xsd: . @prefix exo: . @prefix exr: . <#RecordMapping> rml:logicalSource [ rml:source "/home/skralin/Desktop/results.json"; rml:referenceFormulation ql:JSONPath; rml:iterator "$.results.[*]" ]; rr:subjectMap [ rr:template "http://example.org/resource/record_{record_id}"; rr:class exo:Record ]; rr:predicateObjectMap [ rr:predicate exo:patient_gender; rr:objectMap [ rr:parentTriplesMap <#GenderMapping> ] ]; rr:predicateObjectMap [ rr:predicate exo:patient_age; rr:objectMap [ rml:reference "demographics.age" ; rr:datatype xsd:integer ] ]. <#GenderMapping> rml:logicalSource [ rml:source "/home/skralin/Desktop/results.json"; rml:referenceFormulation ql:JSONPath; rml:iterator "$.results.[*].demographics.gender" ]; rr:subjectMap [ rr:template "http://example.org/resource/gender_{$}"; rr:class exo:Gender ]; rr:predicateObjectMap [ rr:predicate rdfs:label; rr:objectMap [ rml:reference "$" ] ].
您可以定义正确的@context
并使用任何JSON-LD转换器来创建任何RDF序列化。 在这里和这里找到Java示例 。
例
{ "@context":{ "results":{ "@id":"info:stack/49365220/results", "@container":"@list" }, "record_id":{ "@id":"info:stack/49365220/record_id" }, "gender":{ "@id":"info:stack/49365220/gender" }, "age":{ "@id":"info:stack/49365220/age" }, "demographics":{ "@id":"info:stack/49365220/demographics" } }, "results": [ { "record_id": "3d87f4df-f17e-4632-9449", "demographics": { "gender":"female", "race":"", "age":20 } }, { "record_id": "ec5ca92d-865a-431f-9984", "demographics": { "gender":"male", "age":118 } }, { "record_id": "0a79ecf0-83d8-4148-9054", "demographics": { "gender":"female", "age":118 } }, { "record_id": "229276f8-1893-480b-b6e7", "demographics": { "gender":"female", "age":35 } }, { "record_id": "0574cc3b-fb9c-495f-851c", "demographics": { "gender":"female", "age":40 } }, { "record_id": "f3ccfdf6-231e-4a3e-bee0", "demographics": { "gender":"male", "age":118 } } ] }
将它放到Json-Ld Playground (或任何其他RDF工具 )时,您可以生成如下内容:
序列化为N-TRIPLE
_:b0 _:b13 . _:b1 _:b2 . _:b1 "3d87f4df-f17e-4632-9449" . _:b10 "40"^^ . _:b10 "female" . _:b11 _:b12 . _:b11 "f3ccfdf6-231e-4a3e-bee0" . _:b12 "118"^^ . _:b12 "male" . _:b13 _:b1 . _:b13 _:b14 . _:b14 _:b3 . _:b14 _:b15 . _:b15 _:b5 . _:b15 _:b16 . _:b16 _:b7 . _:b16 _:b17 . _:b17 _:b9 . _:b17 _:b18 . _:b18 _:b11 . _:b18 . _:b2 "20"^^ . _:b2 "female" . _:b3 _:b4 . _:b3 "ec5ca92d-865a-431f-9984" . _:b4 "118"^^ . _:b4 "male" . _:b5 _:b6 . _:b5 "0a79ecf0-83d8-4148-9054" . _:b6 "118"^^ . _:b6 "female" . _:b7 _:b8 . _:b7 "229276f8-1893-480b-b6e7" . _:b8 "35"^^ . _:b8 "female" . _:b9 _:b10 . _:b9 "0574cc3b-fb9c-495f-851c" .