【问题标题】:How to convert JSON array to RDF in Java?如何在 Java 中将 JSON 数组转换为 RDF?
【发布时间】:2018-03-26 20:24:10
【问题描述】:

我想在 Java 中将 JSON(不是 JSON-LD)数组转换为 RDF。我在论坛上看到过类似的帖子,但没有确切的答案。 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 }
      }
   ]
}

有什么想法吗? 谢谢!

【问题讨论】:

    标签: java json rdf


    【解决方案1】:

    我建议您不要对这种转换进行硬编码。

    对于 RDBMS 源(顺便说一句,为什么不使用它们),有 W3C 标准化的 R2RML ()。
    对于 JSON 和 XML 源,有 RML,R2RML 的非官方扩展。

    RML Mapper 是 RML 的 Java 实现:

    $ bin/RML-Mapper -m ~/Desktop/mappings.ttl -o ~/Desktop/results.ttl

    一般来说,您应该将rml:iterator "$.results.[*]" 放在rml:logicalSource 部分中以遍历数组元素。确切的答案取决于您要使用哪些词汇表以及您要实现的数据模型。

    假设你需要这样的东西:

    @prefix exr: <http://example.org/resource/> .
    @prefix exo: <http://example.org/ontology/> .
    
    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: <http://www.w3.org/ns/r2rml#>.
    @prefix rml: <http://semweb.mmlab.be/ns/rml#>.
    @prefix ql: <http://semweb.mmlab.be/ns/ql#>.
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
    @prefix exo: <http://example.org/ontology/>.
    @prefix exr: <http://example.org/resource/>.
    
    <#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 "$"
        ]
      ].
    

    【讨论】:

      【解决方案2】:

      您可以定义一个适当的@context 并使用任何 JSON-LD 转换器来创建任何 RDF 序列化。查找Java example herehere

      示例

      {
      "@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(或any other RDF tool)时,你可以产生这样的东西:

      序列化为 N-TRIPLE

      _:b0 <info:stack/49365220/results> _:b13 .
      _:b1 <info:stack/49365220/demographics> _:b2 .
      _:b1 <info:stack/49365220/record_id> "3d87f4df-f17e-4632-9449" .
      _:b10 <info:stack/49365220/age> "40"^^<http://www.w3.org/2001/XMLSchema#integer> .
      _:b10 <info:stack/49365220/gender> "female" .
      _:b11 <info:stack/49365220/demographics> _:b12 .
      _:b11 <info:stack/49365220/record_id> "f3ccfdf6-231e-4a3e-bee0" .
      _:b12 <info:stack/49365220/age> "118"^^<http://www.w3.org/2001/XMLSchema#integer> .
      _:b12 <info:stack/49365220/gender> "male" .
      _:b13 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b1 .
      _:b13 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b14 .
      _:b14 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b3 .
      _:b14 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b15 .
      _:b15 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b5 .
      _:b15 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b16 .
      _:b16 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b7 .
      _:b16 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b17 .
      _:b17 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b9 .
      _:b17 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b18 .
      _:b18 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b11 .
      _:b18 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
      _:b2 <info:stack/49365220/age> "20"^^<http://www.w3.org/2001/XMLSchema#integer> .
      _:b2 <info:stack/49365220/gender> "female" .
      _:b3 <info:stack/49365220/demographics> _:b4 .
      _:b3 <info:stack/49365220/record_id> "ec5ca92d-865a-431f-9984" .
      _:b4 <info:stack/49365220/age> "118"^^<http://www.w3.org/2001/XMLSchema#integer> .
      _:b4 <info:stack/49365220/gender> "male" .
      _:b5 <info:stack/49365220/demographics> _:b6 .
      _:b5 <info:stack/49365220/record_id> "0a79ecf0-83d8-4148-9054" .
      _:b6 <info:stack/49365220/age> "118"^^<http://www.w3.org/2001/XMLSchema#integer> .
      _:b6 <info:stack/49365220/gender> "female" .
      _:b7 <info:stack/49365220/demographics> _:b8 .
      _:b7 <info:stack/49365220/record_id> "229276f8-1893-480b-b6e7" .
      _:b8 <info:stack/49365220/age> "35"^^<http://www.w3.org/2001/XMLSchema#integer> .
      _:b8 <info:stack/49365220/gender> "female" .
      _:b9 <info:stack/49365220/demographics> _:b10 .
      _:b9 <info:stack/49365220/record_id> "0574cc3b-fb9c-495f-851c" .
      

      【讨论】:

      • 为什么要投反对票?
      猜你喜欢
      • 2020-05-29
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多