D2RQ映射MySQL数据库后SPARQL查询无结果求助
D2RQ映射MySQL到RDF:SPARQL无关联结果排查与解决
问题背景
配置D2RQ将MySQL数据库转为RDF并通过SPARQL查询,数据库连接正常,SQL查询可获取关联数据,但SPARQL查询?knowledge ont:relatesTo ?genre无结果,仅基础三元组查询能返回genre表部分数据。
配置详情
本体文件(my_ontology.owl)
<?xml version="1.0"?> <rdf:RDF xmlns="http://example.org/ontology#" xml:base="http://example.org/ontology" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <owl:Ontology rdf:about="http://example.org/ontology"/> <!-- Class Genre --> <owl:Class rdf:about="http://example.org/ontology#Genre"/> <!-- Subclasses of Genre --> <owl:Class rdf:about="http://example.org/ontology#Person"> <rdfs:subClassOf rdf:resource="http://example.org/ontology#Genre"/> </owl:Class> <owl:Class rdf:about="http://example.org/ontology#Organization"> <rdfs:subClassOf rdf:resource="http://example.org/ontology#Genre"/> </owl:Class> <!-- Class Knowledge --> <owl:Class rdf:about="http://example.org/ontology#Knowledge"/> <!-- Property relatesTo --> <owl:ObjectProperty rdf:about="http://example.org/ontology#relatesTo"> <rdfs:domain rdf:resource="http://example.org/ontology#Knowledge"/> <rdfs:range rdf:resource="http://example.org/ontology#Genre"/> </owl:ObjectProperty> </rdf:RDF>
原映射文件(mapping.ttl)
@prefix map: <#> . @prefix db: <> . @prefix vocab: <vocab/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> . @prefix jdbc: <http://d2rq.org/terms/jdbc/> . # Load ontology map:ontology a d2rq:File; d2rq:dataStorage map:database; d2rq:fileName "C:/Users/samue/OneDrive/Desktop/my_ontology.owx". map:database a d2rq:Database; d2rq:jdbcDriver "com.mysql.cj.jdbc.Driver"; d2rq:jdbcDSN "jdbc:mysql://localhost:3306/my_database"; d2rq:username "root"; d2rq:password "test123"; jdbc:zeroDateTimeBehavior "convertToNull"; jdbc:autoReconnect "true"; . # Table genre mapping map:Genre a d2rq:ClassMap; d2rq:dataStorage map:database; d2rq:class <http://example.org/ontology#Genre>; d2rq:uriPattern "genre/@@genre.genre_id@@"; d2rq:classDefinitionLabel "genre"; d2rq:labelColumn "genre.genre_name". # Table knowledge mapping map:Knowledge a d2rq:ClassMap; d2rq:dataStorage map:database; d2rq:class <http://example.org/ontology#Knowledge>; d2rq:uriPattern "knowledge/@@knowledge.knowledge_id@@"; d2rq:classDefinitionLabel "knowledge"; d2rq:labelColumn "knowledge.label". # Table knowledge_to_genre mapping map:KnowledgeToGenre a d2rq:ClassMap; d2rq:dataStorage map:database; d2rq:class <http://example.org/ontology#KnowledgeToGenre>; d2rq:uriPattern "knowledge_to_genre/@@knowledge_to_genre.knowledge_id@@_@@knowledge_to_genre.genre_id@@". # Mapping for relatesTo property map:Knowledge_Genre_Relation a d2rq:PropertyBridge; d2rq:belongsToClassMap map:Knowledge; d2rq:property <http://example.org/ontology#relatesTo>; d2rq:refersToClassMap map:Genre; d2rq:join "knowledge.knowledge_id = knowledge_to_genre.knowledge_id"; d2rq:join "genre.genre_id = knowledge_to_genre.genre_id".
正常SQL查询
SELECT * FROM knowledge JOIN knowledge_to_genre ON knowledge.knowledge_id = knowledge_to_genre.knowledge_id JOIN genre ON genre.genre_id = knowledge_to_genre.genre_id;
无结果SPARQL查询
PREFIX ont: <http://example.org/ontology#> SELECT ?knowledge ?genre WHERE { ?knowledge ont:relatesTo ?genre . } LIMIT 10
问题排查与解决方案
1. 本体文件路径拼写错误
原映射中本体文件名为my_ontology.owx,实际文件是my_ontology.owl,修正路径:
map:ontology a d2rq:File; d2rq:dataStorage map:database; d2rq:fileName "C:/Users/samue/OneDrive/Desktop/my_ontology.owl".
2. PropertyBridge关联配置错误
原PropertyBridge未正确引入中间关联表knowledge_to_genre,D2RQ需要明确指定多表关联的中间表。有两种修正方式:
方式一:使用d2rq:additionalTable直接引入中间表
移除不必要的map:KnowledgeToGenre ClassMap(本体中无对应类),修改PropertyBridge:
# 移除原map:KnowledgeToGenre配置 # Mapping for relatesTo property map:Knowledge_Genre_Relation a d2rq:PropertyBridge; d2rq:belongsToClassMap map:Knowledge; d2rq:property <http://example.org/ontology#relatesTo>; d2rq:refersToClassMap map:Genre; d2rq:join "knowledge.knowledge_id = knowledge_to_genre.knowledge_id"; d2rq:join "knowledge_to_genre.genre_id = genre.genre_id"; d2rq:additionalTable "knowledge_to_genre".
方式二:使用d2rq:viaClassMap关联中间表ClassMap
先在本体中添加KnowledgeToGenre类,或保留原ClassMap,修改PropertyBridge:
# Mapping for relatesTo property map:Knowledge_Genre_Relation a d2rq:PropertyBridge; d2rq:belongsToClassMap map:Knowledge; d2rq:property <http://example.org/ontology#relatesTo>; d2rq:viaClassMap map:KnowledgeToGenre; d2rq:refersToClassMap map:Genre; d2rq:join "knowledge.knowledge_id = knowledge_to_genre.knowledge_id"; d2rq:join "knowledge_to_genre.genre_id = genre.genre_id".
3. 验证映射正确性
使用D2RQ的dump-rdf工具生成部分RDF数据,检查是否存在relatesTo属性的三元组:
dump-rdf -o output.rdf mapping.ttl
打开output.rdf搜索relatesTo,确认关联三元组已生成。
4. 检查表名/字段名大小写一致性
MySQL在Linux系统下表名/字段名区分大小写,确保映射中的表名(如knowledge、genre)与数据库实际表名完全一致。
内容的提问来源于stack exchange,提问作者Samuel Rehkämper
相关产品推荐
相关产品推荐

