在R2RML中有条件地创建属性

时间:2016-03-09 15:30:11

标签: semantic-web r2rml

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

D2RQ映射语言有d2rq:condition可以处理。

e.g:

如果列/表格中的值' name'是' abc'创造财产' abc'

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

如果列/表格中的值' 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建议书中找到任何建议。

有什么想法吗? : - )

更新

我有使用rr:sqlQuery的想法 e.g。

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:constant而不是rr:template s :(。至少W3C建议书只显示predicateMap内的常量。

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

P.S。我很失望像d2rq这样的专有语言似乎更强大(此时)。

2 个答案:

答案 0 :(得分: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" ];
   ].

答案 1 :(得分: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}" ];
].