Условное создание свойства в 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:template
s:( . По крайней мере, Рекомендация 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}" ];
].