在 R2RML 中有条件地创建 属性
Conditional creation of property in R2RML
我正在研究 R2RML,我想知道是否可以根据 RDB table 单元格的内容创建一个 属性。
D2RQ 映射语言 d2rq:condition
可以处理该问题。
例如:
如果 column/table 单元格 'name' 中的值是 'abc' 创建 属性 'abc'
rr:predicateObjectMap [
rr:predicate ex:abc
rr:objectMap [
rr:column "name";
rr:datatype xsd:string;
# equivalent for d2rq:condition "name='abc'"
];
]
如果 column/table 单元格 '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 Recommendation 中找不到任何建议。
有什么想法吗? :-)
更新:
我想到了使用 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
s 而不是 rr:template
s :( 。至少 W3C Recommendation 只显示 predicateMap
内的常量。
仍在寻找解决方案...:/
P.S。我很失望,像 d2rq 这样的专有语言似乎更强大(在这一点上)。
R2RML 没有条件属性(就像在 D2RQ 中一样)。设计是有目的的,以免使语言复杂化。任何类型的 "complex" 映射都需要 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}" ];
].
我正在研究 R2RML,我想知道是否可以根据 RDB table 单元格的内容创建一个 属性。
D2RQ 映射语言 d2rq:condition
可以处理该问题。
例如:
如果 column/table 单元格 'name' 中的值是 'abc' 创建 属性 'abc'
rr:predicateObjectMap [
rr:predicate ex:abc
rr:objectMap [
rr:column "name";
rr:datatype xsd:string;
# equivalent for d2rq:condition "name='abc'"
];
]
如果 column/table 单元格 '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 Recommendation 中找不到任何建议。
有什么想法吗? :-)
更新:
我想到了使用 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
s 而不是 rr:template
s :( 。至少 W3C Recommendation 只显示 predicateMap
内的常量。
仍在寻找解决方案...:/
P.S。我很失望,像 d2rq 这样的专有语言似乎更强大(在这一点上)。
R2RML 没有条件属性(就像在 D2RQ 中一样)。设计是有目的的,以免使语言复杂化。任何类型的 "complex" 映射都需要 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}" ];
].