在RMLStreamer中,grel:arra_join函数不会产生预期的结果。
映射文件(mapping.ttl)
@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix ex: <http://example.com/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rml: <http://semweb.mmlab.be/ns/rml#> .
@prefix ql: <http://semweb.mmlab.be/ns/ql#> .
@prefix grel: <http://users.ugent.be/~bjdmeest/function/grel.ttl#> .
@prefix idlab-fn: <http://example.com/idlab/function/> .
@prefix fno: <https://w3id.org/function/ontology#> .
@prefix gist: <http://ontologies.semanticarts.com/gist#>.
@prefix fnml: <http://semweb.mmlab.be/ns/fnml#> .
@base <http://example.com/base/> .
<TriplesMap1> a rr:TriplesMap;
rml:logicalSource [
rml:source "student.csv";
rml:referenceFormulation ql:CSV
];
rr:subjectMap [
rr:template "http://example.com/{ID}/{Name}";
rr:class foaf:Person
];
rr:predicateObjectMap [
rr:predicate ex:id ;
rr:objectMap [ rml:reference "ID" ]
];
rr:predicateObjectMap [
rr:predicate gist:end;
rr:objectMap <#FunctionMapDateTimeEnd>
].
<#FunctionMapDateTimeEnd> a fnml:FunctionTermMap;
rr:datatype xsd:dateTime;
fnml:functionValue [
rml:logicalSource "student.csv";
rr:predicateObjectMap [
rr:predicate fno:executes;
rr:objectMap [ rr:constant grel:array_join ] ;
] ;
rr:predicateObjectMap [
rr:predicate grel:p_array_a ;
rr:objectMap [ rml:reference "date" ] ;
] ;
rr:predicateObjectMap [
rr:predicate grel:p_array_a ;
rr:objectMap [ rr:constant "T12:00:00.000Z"; ] ;
] ;
].student.csv
ID,Name,Comment,Class,date
1,Venus,A&B,A,2019-11-01输出
<http://example.com/1/Venus> <http://ontologies.semanticarts.com/gist#end> "T12:00:00.000Z2019-11-01"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
<http://example.com/1/Venus> <http://example.com/id> "1" .
<http://example.com/1/Venus> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .输出的问题是grel:array_join连接的顺序。多次执行相同的文件会产生不同的结果。
<http://example.com/1/Venus> <http://ontologies.semanticarts.com/gist#end> "T12:00:00.000Z2019-11-01"^^<http://www.w3.org/2001/XMLSchema#dateTime> .<http://example.com/1/Venus> <http://ontologies.semanticarts.com/gist#end> "2019-11-01T12:00:00.000Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> .然而,预期的输出是每次都以给定的顺序(2019-11-01T12:00:00.000Z)加入列表。
使用RMLMapper的相同映射文件将生成一致且正确的结果,并以给定的顺序加入列表。
其他函数,如grel:toUpperCase和idlab-fn:toUpperCaseURL都可以正常工作,并在RMLStreamer和RMLMapper中生成正确的结果
发布于 2021-09-03 07:46:37
为了解决您的特定问题,您是否尝试过用模板"{date}T12:00:00.000Z"的模板值术语映射替换<#FunctionMapDateTimeEnd>?或者,您可以使用link your own function来连接两个字符串。如果该函数使用命名参数,则默认情况下会保留它们的顺序。
更广泛地说,在保留RML+FnO数组参数的顺序方面确实存在一些已知的问题,尽管也存在修复这些问题的工作,例如参见this issue和related community group page。
https://stackoverflow.com/questions/69033609
复制相似问题