1

在 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"; ] ;
                                                               ] ;
                                             ].

学生.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 中产生正确的结果

4

1 回答 1

0

为了解决您的特定问题,您是否尝试过用模板替换<#FunctionMapDateTimeEnd>模板值术语图"{date}T12:00:00.000Z"?或者,您可以链接自己的函数来连接两个字符串。如果该函数使用命名参数,则默认情况下会保留它们的顺序。

更一般地说,在 RML+FnO 数组参数中保留顺序确实存在一些已知问题,尽管也有修复这些问题的工作,例如参见此问题相关社区组页面

于 2021-09-03T07:46:36.597 回答