我正在通过https://www.joe0.com/2014/09/22/how-to-use-sparql-to-query-dbpedia-and-freebase/中的查询来学习SPARQL和dbpedia。我正在测试一个查询以返回John Lennon的出生日期,我正在http://dbpedia.org/sparql运行我的查询。查询是:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?x0 ?x1 WHERE {
?x0 rdf:type foaf:Person.
?x0 rdfs:label "John Lennon"@en.
?x0 dbpedia-owl:birthDate ?x1.
}
它返回包含相同日期的两行(1940年10月9日)。我的问题是:为什么查询返回两行,即使它使用DISTINCT?在提出这个问题之前,我检查了以下内容:
但我不认为他们会解释重复日期。
修改:我将结果转换为文字并将其粘贴到
下面-------------------------------------- -----------------------------------------------------
x0 x1
--------------------------------------- -----------------------------------------------------
http://dbpedia.org/resource/John_Lennon 1940-10-09
http://dbpedia.org/resource/John_Lennon "1940-10-9"^^<http://www.w3.org/2001/XMLSchema#date>
答案 0 :(得分:1)
我在DBpedia端点上运行您的查询并以基于RDF的格式(Turtle)询问结果,并发现日期文字的词法形式实际上是不同的:
"1940-10-09"^^xsd:date
"1940-10-9"^^xsd:date
第二个实际上不是合法的xsd:date
。第一个是,这可能是SPARQL端点在HTML表格中以“漂亮”的方式打印它的原因(仅为1940-10-09)。
答案 1 :(得分:1)
嗯,这不是你的错!正如您所看到的那样,资源只有这两个三元组here。数据中有重复数据。
答案 2 :(得分:1)
如上所述,似乎dbpedia实际上有两个日期,1940-10-09(有效)和1940-10-9(无效)。答案是添加一个FILTER,将日期转换为字符串,只允许符合YYYY-MM-DD的日期。无论如何它都有效!
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?x0 ?x1 STR(?x1) WHERE {
?x0 rdf:type foaf:Person.
?x0 rdfs:label "John Lennon"@en.
?x0 dbpedia-owl:birthDate ?x1.
FILTER (REGEX(STR(?x1),"[0-9]{4}-[0-9]{2}-[0-9]{2}")).
}
答案 3 :(得分:1)
结果是查询速度变慢,因为对无效日期的每次访问都会触发异常(例如,使用fuseki的查询)或过滤器完成工作以消除错误的日期,但是成本很高< / p>