简体   繁体   English

如何在Java中将JSON数组转换为RDF?

[英]How to convert JSON array to RDF in Java?

I want to convert a JSON (not JSON-LD) array to RDF in Java. 我想将JSON(不是JSON-LD)数组转换为Java中的RDF。 I have seen similar posts to the forum but not exact answer. 我在论坛上看到过类似的帖子,但没有确切的答案。 The JSON array contains objects and arrays, something like: 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 }
      }
   ]
}

Any ideas? 有任何想法吗? Thanx! 感谢名单!

I'd suggest you not hardcoding this conversion. 我建议您不要对转换进行硬编码。

For RDBMS sources (by the way, why not use them), there is W3C-standardized R2RML ( ). 对于RDBMS源(顺便说一句,为什么不使用它们),有W3C标准化的R2RML )。
For JSON and XML sources, there is RML , an unofficial extension of R2RML. 对于JSON和XML源,有RML ,是R2RML的非官方扩展。

RML Mapper is a Java implementation of RML: RML MapperRML的Java实现:

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

In general, you should place rml:iterator "$.results.[*]" in the rml:logicalSource section to iterate over array elements. 通常,应将rml:iterator "$.results.[*]"放在rml:logicalSource部分中,以遍历数组元素。 The exact answer depends on which vocabularies you want to use and the data model you want to achieve. 确切的答案取决于您要使用的词汇表以及要实现的数据模型。

Let's suppose you need something like this: 假设您需要这样的东西:

@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 .

Then your mappings should be: 然后,您的映射应为:

@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 "$"
    ]
  ].

You could define a proper @context and use any JSON-LD converter to create any RDF serialization. 您可以定义适当的@context并使用任何JSON-LD转换器创建任何RDF序列化。 Find Java example here and here . 在这里这里找到Java示例

Example

{
"@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 }
  }
   ]
}

When putting this to Json-Ld Playground (or any other RDF tool ) you can produce something like this: 将其放到Json-Ld Playground (或任何其他RDF工具 )中时,您可以生成如下内容:

serialized as N-TRIPLE 序列化为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" .

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM