json - 用于 json 中数组的 RML 映射器
问题描述
我正在尝试将此 JSON 文件映射到 RDF,但我可能无法正确迭代以获取度量数组内部的“值”的值。
JSON:
{
"status": 0,
"body": {
"updatetime": 1528904042,
"timezone": "Europe\/Rome",
"measuregrps": [{
"grpid": 1154218424,
"attrib": 2,
"date": 1528902698,
"category": 1,
"brand": 1,
"modified": 1528902700,
"deviceid": null,
"measures": [{
"value": 7000,
"type": 11,
"unit": -2,
"algo": 0,
"fw": 0,
"fm": 131
}]
},
{
"grpid": 1154218987,
"attrib": 2,
"date": 1528902745,
"category": 1,
"brand": 1,
"modified": 1528902747,
"deviceid": null,
"measures": [{
"value": 7200,
"type": 11,
"unit": -2,
"algo": 0,
"fw": 0,
"fm": 131
}]
}
]
}
}
RML:
@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 fo: <http://purl.org/ifo/#>.
###### Fitbit MAPPING #######
<#FitbitRestingHeartRate>
rml:logicalSource [
rml:source "provaJson.json";
rml:referenceFormulation ql:JSONPath;
rml:iterator "$.body.measuregrps";
];
rr:subjectMap [
rr:template "http://ifo.com/{grpid}";
rr:class fo:HeartRate;
];
rr:predicateObjectMap [
rr:predicate fo:hasTemporalRelationshipToPhysicalActivity;
rr:objectMap [
rr:constant fo:AtRest;
];
];
rr:predicateObjectMap [
rr:predicate fo:hasMeasure;
rr:objectMap [
rr:parentTriplesMap <#MeasureHeartRate>;
];
].
<#MeasureHeartRate>
rml:logicalSource [
rml:source "provaJson.json";
rml:referenceFormulation ql:JSONPath;
rml:iterator "$.body.measuregrps";
];
rr:subjectMap [
rr:template "http://ifo.com/{grpid}";
rr:class fo:Measure;
rml:iterator "$.body.measuregrps";
];
rr:predicateObjectMap [
rr:predicate fo:hasNumericalValue;
rr:objectMap [
rml:reference "@.measures.value";
rr:datatype xsd:float;
];
];
rr:predicateObjectMap [
rr:predicate fo:hasDescriptiveStatistic;
rr:objectMap [
rr:constant fo:average;
];
];
rr:predicateObjectMap [
rr:predicate fo:hasUnit;
rr:objectMap [
rr:constant fo:bpm;
];
].
谢谢你的帮助,基亚拉
解决方案
调整 JSON 路径表达式允许 RML 处理器检索心率值。对于这两个 TriplesMaps,我将它们更改为
$.body.measuregrps.[*]
遍历每个measuregrps
条目。我
a rr:TriplesMap
为每个 TriplesMap 添加以确保 RML 处理器知道 RDF 描述了 TriplesMap:
<#MeasureHeartRate>
a rr:TriplesMap;
- 与每次测量匹配的所有心率值。我添加了一个仅在值相等
rr:joinCondition
时将心率值与正确的测量值连接起来:grpid
rr:predicateObjectMap [
rr:predicate fo:hasMeasure;
rr:objectMap [
rr:parentTriplesMap <#MeasureHeartRate>;
rr:joinCondition [
rr:child "grpid";
rr:parent "grpid";
];
];
].
- 我更改了心率测量映射的 IRI,因为 IRI 不是唯一的,导致循环:
<http://ifo.com/1154218987> <http://purl.org/ifo/#hasMeasure> <http://ifo.com/1154218987>
新的 IRI 格式还支持除心率之外的其他类型的测量。
映射规则:
@base <http://example.org> .
@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 fo: <http://purl.org/ifo/#> .
<#FitbitRestingHeartRate>
a rr:TriplesMap;
rml:logicalSource [
rml:source "provaJson.json";
rml:referenceFormulation ql:JSONPath;
rml:iterator "$.body.measuregrps.[*]";
];
rr:subjectMap [
rr:template "http://ifo.com/{grpid}";
rr:class fo:HeartRate;
];
rr:predicateObjectMap [
rr:predicate fo:hasTemporalRelationshipToPhysicalActivity;
rr:objectMap [
rr:constant fo:AtRest;
];
];
rr:predicateObjectMap [
rr:predicate fo:hasMeasure;
rr:objectMap [
rr:parentTriplesMap <#MeasureHeartRate>;
rr:joinCondition [
rr:child "grpid";
rr:parent "grpid";
];
];
].
<#MeasureHeartRate>
a rr:TriplesMap;
rml:logicalSource [
rml:source "provaJson.json";
rml:referenceFormulation ql:JSONPath;
rml:iterator "$.body.measuregrps.[*]";
];
rr:subjectMap [
rr:template "http://ifo.com/{grpid}/{date}/{measures.[*].type}";
rr:class fo:Measure;
];
rr:predicateObjectMap [
rr:predicate fo:hasNumericalValue;
rr:objectMap [
rml:reference "measures.[*].value";
rr:datatype xsd:float;
];
];
rr:predicateObjectMap [
rr:predicate fo:hasDescriptiveStatistic;
rr:objectMap [
rr:constant fo:average;
];
];
rr:predicateObjectMap [
rr:predicate fo:hasUnit;
rr:objectMap [
rr:constant fo:bpm;
];
].
输出:
<http://ifo.com/1154218424> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/ifo/#HeartRate>.
<http://ifo.com/1154218424> <http://purl.org/ifo/#hasTemporalRelationshipToPhysicalActivity> <http://purl.org/ifo/#AtRest>.
<http://ifo.com/1154218424> <http://purl.org/ifo/#hasMeasure> <http://ifo.com/1154218424/1528902698/11>.
<http://ifo.com/1154218987> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/ifo/#HeartRate>.
<http://ifo.com/1154218987> <http://purl.org/ifo/#hasTemporalRelationshipToPhysicalActivity> <http://purl.org/ifo/#AtRest>.
<http://ifo.com/1154218987> <http://purl.org/ifo/#hasMeasure> <http://ifo.com/1154218987/1528902745/11>.
<http://ifo.com/1154218424/1528902698/11> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/ifo/#Measure>.
<http://ifo.com/1154218424/1528902698/11> <http://purl.org/ifo/#hasNumericalValue> "7000"^^<http://www.w3.org/2001/XMLSchema#float>.
<http://ifo.com/1154218424/1528902698/11> <http://purl.org/ifo/#hasDescriptiveStatistic> <http://purl.org/ifo/#average>.
<http://ifo.com/1154218424/1528902698/11> <http://purl.org/ifo/#hasUnit> <http://purl.org/ifo/#bpm>.
<http://ifo.com/1154218987/1528902745/11> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/ifo/#Measure>.
<http://ifo.com/1154218987/1528902745/11> <http://purl.org/ifo/#hasNumericalValue> "7200"^^<http://www.w3.org/2001/XMLSchema#float>.
<http://ifo.com/1154218987/1528902745/11> <http://purl.org/ifo/#hasDescriptiveStatistic> <http://purl.org/ifo/#average>.
<http://ifo.com/1154218987/1528902745/11> <http://purl.org/ifo/#hasUnit> <http://purl.org/ifo/#bpm>.
注意:我为 RML 及其技术做出了贡献。
推荐阅读
- python - DASK:dask 是否有 numpy.select 的等价物?
- javascript - Firebase:如何将用户从 firebase.auth().onAuthStateChanged 异步绑定到 Angular 模板?
- matplotlib - 使 Y 轴值显示在 pyplot 的子图上
- google-drive-api - 为什么在使用 Google Drive 时看不到文件夹?
- json - Angular Http JSON 响应映射
- .net - 为什么 .NET 的 RandomNumberGenerator.GetBytes 方法将其结果分配给字节数组参数,而不是返回一个新的字节数组?
- android - 如何通过 Instagram 故事等控件实现图像之间的导航?
- python - 检索 Django 对象返回 AttributeError:模块 'types' 没有属性 'StringTypes'
- python - 用结构化字符串的内容填充结构化数组的比这更 Pythonic(更短/更有效)的方式?
- javascript - 需要在我使用 javascript 添加到页面的按钮的 onclick 事件上传递参数