2016-07-14 8 views
1

Следующий запрос SPARQL дает дубликаты в Virtuoso, даже если используется предложение DISTINCT. Вы можете проверить запрос в DBpedia public endpoint. В чем проблема с запросом?SPARQL DISTINCT дает дубликаты в Virtuoso

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 

ответ

4

Я могу подтвердить, что кажется, что есть дубликаты в результатах. Я не совсем уверен, что проблема с дубликатами, но мне интересно, может ли это что-то сделать с неточным равенством чисел с плавающей запятой. Если вместо выбрать ИНГ число с плавающей запятой напрямую, вы выбираете их лексические формы с (обратите внимание на (ул (...) в ранге) в конце?):

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

Я не получаю ни одного дубликата. Это может стоить сообщать людям Virtuoso как ошибку. Для чего стоит, если вам нужны значения с плавающей запятой для ранга, вы можете использовать xsd: float как функцию, чтобы превратить эту строку обратно в значение с плавающей запятой, а когда я это сделаю, с выберите, как показано ниже , Я все еще получаю ожидаемые результаты .

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

SPARQL results

+0

Похоже, форматирование запросов сломано, по крайней мере, я могу видеть только их часть. – AKSW

+0

@AKSW Это не сломан; Я только опубликовал 'select distinct ... {' part, потому что это все, что я изменил. Вот почему я привел в эти части, например, «вы выбираете их лексические формы». –

+0

А, ладно, теперь я получил это. – AKSW