[英]How to convert JSON array to RDF in Java?
我想將JSON(不是JSON-LD)數組轉換為Java中的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 }
}
]
}
有任何想法嗎? 感謝名單!
我建議您不要對轉換進行硬編碼。
對於RDBMS源(順便說一句,為什么不使用它們),有W3C標准化的R2RML ( 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 "$"
]
].
您可以定義適當的@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 <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.