Условное создание свойства в R2RML

Я играю с R2RML, и мне было интересно, могу ли я создать свойство в зависимости от содержимого ячейки таблицы RDB.

Язык отображения D2RQ имеет d2rq:condition с этим можно справиться.

например:

если значение в ячейке столбца / таблицы '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 например

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

и применить его к rr:predicate или же rr:predicateMap с

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

Но это не сработало. Похоже predicateMaps может быть rr:constantтолько и не rr:templates:( . По крайней мере, Рекомендация W3C просто показывает константы внутри predicateMap,

Все еще в поисках решения...: /

PS Я разочарован тем, что проприетарный язык, такой как d2rq, кажется более мощным (на данный момент).

2 ответа

Решение

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

Мы обычно делаем это при отображении словарей 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}" ];
].
Другие вопросы по тегам