如何在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" .