In RMLStreamer, grel:arra_join function does not produce the expected results.
Mapping File (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
Output
<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> .
The problem with the output is the order of join by grel:array_join. Executing the same files multiple times generate different results.
<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> .
However, the expected output is to join the list in the given order (2019-11-01T12:00:00.000Z) every time.
The same mapping file with RMLMapper produces consistent and correct results and join the list in the given order.
Other functions such as grel:toUpperCase and idlab-fn:toUpperCaseURL work fine and produce correct results in both RMLStreamer and RMLMapper
To solve your specific issue, have you tried replacing
<#FunctionMapDateTimeEnd>
with a template-valued term map with template"{date}T12:00:00.000Z"
? Alternatively, you could link your own function to concatenate two strings. If that function uses named parameters, their order is preserved by default.More generally, there are indeed some known issues with preserving order in RML+FnO array parameters, although there is also work to fix them, see for example this issue and the related community group page.