SPARQL DISTINCT在Virtuoso中提供重复项

jor*_*ala 1 sparql dbpedia virtuoso

即使使用DISTINCT子句,以下SPARQL查询也会在Virtuoso中提供重复项。您可以在DBpedia公共端点中测试查询。查询有什么问题?

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)
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

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

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
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 5

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

SELECT DISTINCT
  ?person1 ?person1_id
  ?person2 ?person2_id
  (str(?person2_rank) as ?rank)
Run Code Online (Sandbox Code Playgroud)

我没有任何重复。这可能是值得向维塔索索人报告的错误。对于它的价值,如果您想使用浮点值作为等级,则可以使用xsd:float作为将字符串转换回浮点值的函数,当我这样做时,通过如下所示的选择,我仍然可以预期的不同结果。

SELECT DISTINCT
  ?person1 ?person1_id
  ?person2 ?person2_id
  (xsd:float(str(?person2_rank)) as ?rank)
Run Code Online (Sandbox Code Playgroud)

SPARQL结果