1

我正在使用RMLMapper将 JSON 转换为 RDF。存储在 JSON 中的值之一是 URL。我想以此作为 RDF 语句对象的 IRI 的基础。

输入是

{
  "documentId": {
    "value": "http://example.org/345299"
  },
...

我希望语句主题的 IRI 是http://example.org/345299#item,例如<http://example.org/345299#item> a <http://schema.org/Thing> .

我试过了

@prefix rr: <http://www.w3.org/ns/r2rml#>.
@prefix rml: <http://semweb.mmlab.be/ns/rml#>.
@prefix ql: <http://semweb.mmlab.be/ns/ql#>.
<#Mapping> a rr:TriplesMap ;
  rml:logicalSource [
    rml:source "input.json";
    rml:referenceFormulation ql:JSONPath;
    rml:iterator "$"
  ];

  rr:subjectMap [
    rr:template "{documentId.value}#item" ;
    rr:class schema:Thing
  ]

给出rr:template "{documentId.value}#item"不产生有效 IRI 的错误。

为@base 提供一个值会给出一个有效的IRI,但它是在基础上附加了url 编码值的基础,例如<http://example.org/http%3A%2F%2Fexample.org%2Fjobposts%2F345299#item>

那么在 r2rml / rml 中是否有任何方法可以获取一个值并将其用作 IRI?或者将字符串转换为 IRI?

4

2 回答 2

1

一种选择是不使用 rr:template,而是使用 FnO 函数将存储的 URI 与#item.

可以在此处找到有关如何执行此操作的文档。

在您给出的示例中,用它替换主题图给出了所需的解决方案:

<#Mapping> rr:subjectMap [
  a fnml:FunctionTermMap;
  rr:termType rr:IRI;
  fnml:functionValue [
    rml:logicalSource <#Source> ;
    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 "documentId.value" ] ;
    ] ;
    rr:predicateObjectMap [
      rr:predicate grel:p_array_a ;
      rr:objectMap [ rr:constant "#item" ] ;
    ] ;
  ] .

注意:我为 RML 及其技术做出了贡献。

于 2021-02-05T09:11:14.707 回答
0

rml:reference足够接近。

  rr:subjectMap [
    rml:reference "documentId.value" ;
    rr:class schema:Thing
  ]

似乎不允许我追加#item,但现在就可以了。

于 2021-01-26T12:15:00.537 回答