1

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

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

例如:

如果列/表格单元格“名称”中的值为“abc”,则创建属性“abc”

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

如果列/表格单元格“名称”中的值为“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 推荐中找不到任何建议。

有任何想法吗?:-)


更新:

我有使用rr:sqlQuery 例如的想法

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

并将其应用于 a rr:predicateor rr:predicateMapwith

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

但这没有用。我想predicateMaps可以是rr:constants only 而不是rr:templates :( 。至少 W3C 建议只显示predicateMap.

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

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

4

2 回答 2

1

R2RML 没有条件属性(如在 D2RQ 中)。该设计是故意进行的,以免使语言复杂化。任何类型的“复杂”映射都需要 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" ];
   ].
于 2016-03-15T15:58:48.047 回答
0

我们通常在映射 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}" ];
].
于 2016-03-28T19:45:31.240 回答