在 R2RML 中有条件地创建 属性

Conditional creation of property in R2RML

我正在研究 R2RML,我想知道是否可以根据 RDB table 单元格的内容创建一个 属性。

D2RQ 映射语言 d2rq:condition 可以处理该问题。

例如:

如果 column/table 单元格 'name' 中的值是 'abc' 创建 属性 'abc'

rr:predicateObjectMap [
    rr:predicate ex:abc
    rr:objectMap [ 
        rr:column "name"; 
        rr:datatype xsd:string; 
        # equivalent for d2rq:condition "name='abc'"
    ];
]

如果 column/table 单元格 'name' 中的值是 'xyz' 创建 属性 'xyz'

rr:predicateObjectMap [
    rr:predicate ex:xyz
    rr:objectMap [ 
        rr:column "name"; 
        rr:datatype xsd:decimal; 
        # equivalent for d2rq:condition "name='xyz'"
    ];
];

我在 W3C 的 R2RML Recommendation 中找不到任何建议。

有什么想法吗? :-)


更新:

我想到了使用 rr:sqlQuery 例如

rr:SQLQuery """
   select (case TABLENAME.COLUMNNAME
      when 'this' then 'propertyOne'
      when 'that' then 'propertyTwo'
      end) as VARIABLE_PREDICATE
   from TABLENAME """;

并将其应用于 rr:predicaterr:predicateMap

rr:predicateObjectMap [
        rr:predicateMap [ rr:template "ex:{VARIABLE_PREDICATE}" ];
        rr:objectMap [ rr:column "COLUMNNAME"; ];
];

但这没有用。我猜 predicateMaps 只能是 rr:constants 而不是 rr:templates :( 。至少 W3C Recommendation 只显示 predicateMap 内的常量。

仍在寻找解决方案...:/

P.S。我很失望,像 d2rq 这样的专有语言似乎更强大(在这一点上)。

R2RML 没有条件属性(就像在 D2RQ 中一样)。设计是有目的的,以免使语言复杂化。任何类型的 "complex" 映射都需要 SQL。

解决方法如下:

@prefix rr: <http://www.w3.org/ns/r2rml#>.

<#Mapping> a rr:TriplesMap;
    rr:logicalTable [ rr:SQLQuery """
        select id, COLUMNNAME, (case TABLENAME.COLUMNNAME
        when 'this' then 'http://ex.com/propertyOne'
        when 'that' then 'http://ex.com/propertyTwo'
        end) as VARIABLE_PREDICATE
        from TABLENAME """; ];
    rr:subjectMap [
       rr:template "http://ex.com/foo/{id}";
   ];

   rr:predicateObjectMap [
      rr:predicateMap [ rr:column "VARIABLE_PREDICATE" ];
      rr:objectMap [ rr:column "COLUMNNAME" ];
   ].

我们在映射 Getty 词汇时经常这样做,用于依赖键值(标志)的道具。例如

<#ContribTermRelPreferred>
    a rr:TriplesMap;
    rr:logicalTable [ rr:sqlQuery """
    SELECT ...
        UDF_LOD_LOOKUP_PROPERTY('contrib_rels_term','preferred',CRT.PREFERRED) CONTRIBPREF
    """ ];
rr:predicateObjectMap [
    rr:predicateMap [ rr:column "CONTRIBPREF" ];
    rr:objectMap [ rr:template "http://vocab.getty.edu/aat/contrib/{CONTRIB_ID}" ];
].