我正在尝试设置 D2RQ 映射以将我的 MySQL 数据库公开为 RDF 并使用 SPARQL 对其进行查询。虽然我的数据库连接似乎工作正常并且我可以直接通过 SQL 查询检索数据,但我的 SPARQL 查询没有返回任何结果。以下是我的设置的详细信息:
本体(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 查询
此 SQL 查询正确地从我的数据库检索数据:
mySQL 查询:(https://i.sstatic.net/p9bTIRfg.png)
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 Queries
我尝试了几个 SPARQL 查询,但没有一个返回任何结果。以下是一些例子:
PREFIX ont: <http://example.org/ontology#>
SELECT ?knowledge ?genre
WHERE {
?knowledge ont:relatesTo ?genre .
}
LIMIT 10
仅基本查询
(SELECT DISTINCT ?s ?p ?o WHERE { ?s ?p ?o } LIMIT 10)
返回结果,显示流派表中的一些数据。
数据映射似乎是正确的,因为 SQL 查询返回了预期结果。
任何帮助或建议将不胜感激!
我认为D2rq已经很多年没有维护了。它的现代替代品位于顶部: https://github.com/ontop/ontop