【问题标题】:SPARQL DISTINCT gives duplicates in VirtuosoSPARQL DISTINCT 在 Virtuoso 中给出重复项
【发布时间】:2016-07-14 09:54:02
【问题描述】:

即使使用 DISTINCT 子句,以下 SPARQL 查询也会在 Virtuoso 中给出重复项。您可以在DBpedia public endpoint 中测试查询。查询有什么问题?

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dbpedia:<http://dbpedia.org/resource/>
PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
PREFIX vrank:<http://purl.org/voc/vrank#>
SELECT DISTINCT ?person1 ?person1_id ?person2 ?person2_id ?person2_rank
FROM <http://dbpedia.org> 
FROM <http://people.aifb.kit.edu/ath/#DBpedia_PageRank> 
WHERE {
    ?person1 rdf:type dbpedia-owl:Person.
    ?person2 rdf:type dbpedia-owl:Person.
    ?person1 ?link ?person2.
    ?person1 dbpedia-owl:wikiPageID ?person1_id.
    ?person2 dbpedia-owl:wikiPageID ?person2_id.
    ?person2 vrank:hasRank/vrank:rankValue ?person2_rank.
    FILTER (?person1_id != ?person2_id).
    FILTER (?person1_id = 308)
} ORDER BY DESC(?person2_rank) ASC(?person2_id)

SPARQL results

结果包括看似重复的行,例如:

http://dbpedia.org/resource/Aristotle 308 http://dbpedia.org/resource/Democritus  8211 27.281
http://dbpedia.org/resource/Aristotle 308 http://dbpedia.org/resource/Democritus  8211 27.281
http://dbpedia.org/resource/Aristotle 308 http://dbpedia.org/resource/Heraclitus 13792 26.6914
http://dbpedia.org/resource/Aristotle 308 http://dbpedia.org/resource/Heraclitus 13792 26.6914
http://dbpedia.org/resource/Aristotle 308 http://dbpedia.org/resource/Parmenides 23575 19.6082
http://dbpedia.org/resource/Aristotle 308 http://dbpedia.org/resource/Parmenides 23575 19.6082

【问题讨论】:

  • Also asked on Github。上面的查询今天在 DBpedia 上带来了零解决方案。您能否更新您的查询,并说明您是否仍然看到所描述的问题?

标签: sparql dbpedia virtuoso


【解决方案1】:

我可以确认结果中似乎存在重复项。我不确定重复项的问题是什么,但我想知道它是否可能与浮点数的不精确相等有关。如果不是直接选择浮点数,而是选择它们的词法形式(注意最后的 (str(...) as ?rank)) :

SELECT DISTINCT
  ?person1 ?person1_id
  ?person2 ?person2_id
  (str(?person2_rank) as ?rank)

我没有得到任何重复。这可能值得作为错误报告给 Virtuoso 人。对于它的价值,如果您想要排名的浮点值,您可以使用 xsd:float 作为函数将该字符串转换回浮点值,当我这样做时,使用 select 像下面这样,我仍然得到预期的distinct结果。

SELECT DISTINCT
  ?person1 ?person1_id
  ?person2 ?person2_id
  (xsd:float(str(?person2_rank)) as ?rank)

SPARQL results

【讨论】:

  • 查询的格式好像坏了,至少我只能看到其中的一部分。
  • @AKSW 没坏;我只发布了select distinct ... { 部分,因为这就是我所做的全部更改。这就是为什么我用例如“you select their lexical forms with”进入这些部分。
  • 啊,好的 - 现在我明白了。
【解决方案2】:

虽然这对您的 dbpedia 查询没有帮助,但通过搜索标题并控制模型和数据到达这里的任何人都可能想知道:

virtuoso double 似乎没有遇到 float

出现的这种 SELECT DISTINCT 问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多