1

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

1 Answers1

0

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.

  • Thank you for suggesting a solution to fix this particular case `[rr:template "{date}T12:00:00.000Z"; rr:termType rr:Literal;];` However, the main problem I am facing is to read URL from data as a base of `rr:subjectMap` IRI. SubjectMap doesn't allow `rr:template "{url}"`. One of solutions I found suggested to use array_join https://stackoverflow.com/questions/65900785/is-there-any-way-in-rml-r2rml-to-take-a-value-as-an-iri PS: In your answer link of [this issue] doesn't work. – Digital-Logic Sep 03 '21 at 20:01