SPARQL查询返回同一个人的多个出生日期

SPARQL查询返回同一个人的多个出生日期,sparql,dbpedia,Sparql,Dbpedia,我正在通过中的查询学习SPARQL和dbpedia。我正在测试一个查询以返回John Lennon的出生日期,并在中运行我的查询。查询是: 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/>

我正在通过中的查询学习SPARQL和dbpedia。我正在测试一个查询以返回John Lennon的出生日期,并在中运行我的查询。查询是:

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>

我在DBpedia端点上运行了您的查询,并以基于RDF的格式查询结果,发现日期文本的词汇形式实际上是不同的:

"1940-10-09"^^xsd:date
"1940-10-9"^^xsd:date

第二个日期实际上不是合法的xsd:date。第一个是,这可能就是SPARQL端点在HTML表中以相当的方式打印它的原因,仅为1940-10-09。

我在DBpedia端点上运行了您的查询,并以基于RDF的格式查询结果,发现日期文本的词汇形式实际上是不同的:

"1940-10-09"^^xsd:date
"1940-10-9"^^xsd:date

第二个日期实际上不是合法的xsd:date。第一个是,这可能就是SPARQL端点在HTML表中以相当时尚的方式打印它的原因,就像1940-10-09一样。

好吧,这不是你的错!正如您所看到的,资源具有这两个三元组。数据中有重复项。

好吧,这不是你的错!正如您所看到的,资源具有这两个三元组。数据中有重复项。

如前所述,dbpedia实际上有两个日期,1940-10-09有效和1940-10-9无效。答案是添加一个过滤器,将日期转换为字符串,只允许符合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}")).
} 

如上所述,dbpedia实际上有两个日期,1940-10-09有效和1940-10-9无效。答案是添加一个过滤器,将日期转换为字符串,只允许符合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}")).
} 

结果是查询速度变慢,因为每次访问无效日期都会引发异常,例如,fuseki或筛选器执行的任务是消除错误的日期,但代价高昂

结果是查询速度变慢,因为每次访问无效日期都会引发异常,通过fuseki或过滤器的查询,可以消除错误的日期,但代价很高

不,它们是一样的。我将尝试复制/粘贴结果。不,它们是相同的。我将尝试复制/粘贴结果。但我不明白为什么应该有两个日期文本-那天应该只有一个约翰·列侬出生。关于RDF形式的结果,我不认为我引用的dbpedia端点可以做到这一点。我的错误,我还在这里学习。您是如何使端点显示RDF的?另外,我刚刚编辑了我的问题并添加了查询结果。我对RDF表示歉意,我按照您所说的将下拉列表更改为RDF,这样我就可以下载生成的RDF文件了。@JoshuaTaylor xsd:date中的单个数字是非法的。活的尝试没有他的缺点。因此,在那个版本的dbpedia中使用的提取器中有一些bug,但我不理解为什么应该有两个日期文本——那天应该只有一个John Lennon出生。关于RDF形式的结果,我不认为我引用的dbpedia端点可以做到这一点。我的错误,我还在这里学习。您是如何使端点显示RDF的?另外,我刚刚编辑了我的问题并添加了查询结果。我对RDF表示歉意,我按照您所说的将下拉列表更改为RDF,这样我就可以下载生成的RDF文件了。@JoshuaTaylor xsd:date中的单个数字是非法的。活的尝试没有他的缺点。因此,用于该版本dbpedia的提取器中存在一些错误。我可以在?x1中的日期中添加一个过滤器或条件,使其仅返回有效日期吗?在SQL中有一个ISDATE函数,但我不知道有足够的SPARQL来做同样的事情。我意识到SQL和SPARQL是完全不同的东西。我可以在?x1中的日期中添加一个过滤器或条件,使其只返回有效的日期吗?在SQL中有一个ISDATE函数,但我不知道有足够的SPARQL来做同样的事情。PS:我意识到SQL和SPARQL是完全不同的东西。