我正在玩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: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
内的常量。
仍在寻找解决方案......:/
P.S。我很失望像d2rq这样的专有语言似乎更强大(此时)。
答案 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}" ];
].