D2RQ映射无法生成带属性RDF空白节点问题求助
问题原因
- 核心问题是映射中两个关联的ClassMap(
map:Population和map:Range_Year_QTY)都直接映射同一张FCT_POPULATION表,但配置db:indicator对应的属性桥时,没有指定两个ClassMap之间的记录关联规则。D2RQ不会自动推断同表映射的关联条件,拉取空白节点属性时,无法将当前城市+年份的Population实例,和对应同城市、同年份下不同RANGE_ID的记录做匹配,最终只能生成无属性的空空白节点。 - 次要隐患:当前空白节点的唯一标识配置
d2rq:bNodeIdColumns没有包含CITY_ID字段,当不同城市存在同年份、同区间、同指标值的记录时,会生成ID相同的空白节点,造成数据串扰。另外你配置的URI路径为population/开头,但示例期望的资源路径为populacao/,如果路径配置和实际访问路径不一致也会触发资源匹配异常,需要自行核对。
解决方法
调整映射文件内容,重点补充关联条件、修正空白节点标识规则,修正后的完整映射参考如下:
# Table FCT_POPULATION map:Population a d2rq:ClassMap; d2rq:dataStorage map:database; # 注意核对uriPattern和你实际访问的路径前缀,和预期访问路径保持一致 d2rq:uriPattern "populacao/@@FCT_POPULATION.CITY_ID@@/@@FCT_POPULATION.YEAR@@"; d2rq:class :Population; . map:BN_Range_Year_QTY a d2rq:PropertyBridge; d2rq:belongsToClassMap map:Population; d2rq:property :indicator; d2rq:refersToClassMap map:Range_Year_QTY; # 新增同表关联条件,D2RQ会自动为同表的两个ClassMap生成表别名完成关联 d2rq:join "FCT_POPULATION.CITY_ID = FCT_POPULATION.CITY_ID AND FCT_POPULATION.YEAR = FCT_POPULATION.YEAR"; . map:Range_Year_QTY a d2rq:ClassMap; d2rq:dataStorage map:database; # 修正空白节点唯一标识,加入CITY_ID避免跨城市冲突,用业务主键即可无需包含指标值QTY d2rq:bNodeIdColumns "FCT_POPULATION.CITY_ID,FCT_POPULATION.YEAR,FCT_POPULATION.RANGE_ID"; . map:quantity a d2rq:PropertyBridge; d2rq:belongsToClassMap map:Range_Year_QTY ; d2rq:property :quantity; d2rq:column "FCT_POPULATION.QTY"; . map:ano a d2rq:PropertyBridge; d2rq:belongsToClassMap map:Range_Year_QTY ; d2rq:property :year; d2rq:column "FCT_POPULATION.YEAR"; . map:faixa a d2rq:PropertyBridge; d2rq:belongsToClassMap map:Range_Year_QTY ; d2rq:property :range; d2rq:column "FCT_POPULATION.RANGE_ID"; .
调整完成后,重启d2r-server服务再访问对应资源,即可看到空白节点下正常挂载year、range、quantity三个属性,输出结构和预期RDF格式一致。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

