我基本上希望使用SPARQL构造查询从DBPEdia到GraphDB的本地版本检索数据。构造查询应该能够映射到与音乐有关的尽可能多的关系和数据。我曾尝试在GraphDB Workbench中运行构造查询,但我不确定该如何进行。
在GraphDB在线教程中,他们总是使用文件或在线资源导入数据,而我找不到任何使用构造查询直接在数据库中获取数据的示例。
任何对此的建议将不胜感激。感谢您抽出宝贵的时间来帮助您。
答案 0 :(得分:1)
GraphDB支持导入已经转换为RDF数据格式的数据。从外部端点(如DBPedia)导入数据的最简单方法是使用SPARQL联合。这是一个示例查询,该查询从远程端点获取数据并将其导入到当前选择的GraphDB存储库中:
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
INSERT {
?s ?p ?o2
}
WHERE {
# Execute the query against DBPedia's endpoint
SERVICE <http://dbpedia.org/sparql> {
SELECT ?s ?p ?o2
{
# Select all triples for Madonna
?s ?p ?o
FILTER (?s = <http://dbpedia.org/resource/Madonna_(entertainer)>)
# Hacky function to rewrite all Literals of type rdf:langStrings without a language tag
BIND (
IF (
(isLiteral(?o) && datatype(?o) = rdf:langString && lang(?o) = ""),
(STRDT(STR(?o), xsd:string)),
?o
)
AS ?o2
)
}
}
}
不幸的是,DBPedia和底层数据库引擎因不严格遵守SPARQL 1.1和RDF 1.1规范而臭名昭著。该服务返回的rdf:langString类型的RDF文字没有适当的语言标记:
...
<result>
<binding name="s"><uri>http://dbpedia.org/resource/Madonna_(entertainer)</uri></binding>
<binding name="p"><uri>http://dbpedia.org/property/d</uri></binding>
<binding name="o"><literal datatype="http://www.w3.org/1999/02/22-rdf-syntax-ns#langString">Q1744</literal></binding>
</result>
...
克服此问题的唯一方法是添加一个额外的过滤器,以即时对其进行重写。