SPARQL查询返回同一人多出生日期(SPARQL query returns multiple b

2019-10-30 06:33发布

我通过查询中的工作学习SPARQL和DBpedia中https://www.joe0.com/2014/09/22/how-to-use-sparql-to-query-dbpedia-and-freebase/ 。 我测试的查询返回出生约翰·列侬的日期,我跑我的查询中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? 在此之前问这个问题我查了以下内容:

  • 为什么我的SPARQL查询复制的结果吗?
  • 使SPARQL查询时重复行

但我不认为他们解释重复的日期。

编辑 :我转换的结果,以文字和粘贴下面这些

-------------------------------------- -----------------------------------------------------
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>

Answer 1:

嗯,这是不是你的错! 只需将资源有两种三元的,你可以看到在这里 。 有数据重复。



Answer 2:

我跑了DBpedia的端点查询,并要求在基于RDF格式(龟)的结果,发现日期文字的词汇形式实际上是不同的:

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

第二个实际上不是一个合法xsd:date 。 首先是,这可能是为什么在SPARQL端点它打印在HTML表格(如刚1940年10月9日),“漂亮”的时尚。



Answer 3:

如前所述似乎DBpedia中实际上有两个日期,1940年10月9日(有效)和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}")).
} 


Answer 4:

其结果是在查询,因为每次访问一个无效的日期TRIG异常(例如,从定式查询)或过滤器做的工作,以消除错误的日期放缓,但它是昂贵的



文章来源: SPARQL query returns multiple birth dates for same person