使用TARQL转换CSV为RDF时日期类型转换及字段丢失问题
问题根因
xsd:date、xsd:dateTime 对输入字符串格式有强制规范:
xsd:date仅接受YYYY-MM-DD格式的字符串xsd:dateTime仅接受YYYY-MM-DDThh:mm:ss[可选时区]格式的字符串
CSV中存储的日期为04-09-2021这类非标准格式,直接调用xsd:dateTime(?Date)会触发类型转换失败,最终?date变量被绑定为空值。TARQL构造三元组时会自动跳过对象为空的条目,因此最终输出的RDF中完全不显示date字段。
修复方案
先通过字符串函数把原始日期整理为XSD支持的标准格式,再执行类型转换即可。
注意:需要先确认原始日期的分段规则是
日-月-年还是月-日-年,调整拼接顺序即可。以下示例默认原始日期为日-月-年格式:
PREFIX ex: <http://www.hobbiton.com/schema> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> CONSTRUCT { ?product_iri ex:product ?Product ; ex:farmer ?Farmer ; ex:date ?date ; ex:count ?count . } FROM <file:farming.csv> WHERE { BIND(REPLACE(STR(?Product),"[ ]","_") AS ?product) BIND(IRI(CONCAT('http://www.hobbiton.com/schema/product#', ?product)) AS ?product_iri) BIND(xsd:integer(?Count) AS ?count) # 拆分原始日期的三个分段 BIND(STRBEFORE(?Date, "-") AS ?day) BIND(STRBEFORE(STRAFTER(?Date, "-"), "-") AS ?month) BIND(STRAFTER(STRAFTER(?Date, "-"), "-") AS ?year) # 拼接为YYYY-MM-DD标准格式,若原始是月-日-年,交换?day和?month位置即可 BIND(CONCAT(?year, "-", ?month, "-", ?day) AS ?standard_date_str) # 转换为xsd:date类型,需dateTime类型则替换为xsd:dateTime(CONCAT(?standard_date_str, "T00:00:00")) BIND(xsd:date(?standard_date_str) AS ?date) }
输出效果
运行修正后的脚本,输出的TURTLE文件会正常携带日期字段,示例片段如下:
<http://www.hobbiton.com/schema/product#pumpkin> ex:product "pumpkin" ; ex:farmer "Bolger" ; ex:date "2021-09-04"^^xsd:date ; ex:count 29 . <http://www.hobbiton.com/schema/product#tomato> ex:product "tomato" ; ex:farmer "Bolger" ; ex:date "2021-09-04"^^xsd:date ; ex:count 62 .
内容的提问来源于stack exchange,提问作者EMD
相关产品推荐
相关产品推荐

