2016-06-16 2 views
0

Извините за неукротимое название, я французский, и я не знал, как разоблачить мою проблему. Я думаю, что лучший способ объяснить это - пример.Sparql - Как построить RDF, выбрав MAX значения объектов, сгруппированных по свойствам?

У меня есть несколько наборов RDF, как это:

prefix p: <http://localhost/rdf/> 

p:set p:hasTitle p:val1 . 
p:set p:hasTitle p:val2 . 
p:set p:hasAuthor p:val3 . 
p:set p:hasAuthor p:val4 . 

p:val1 p:hasValue "Harry Peter" . 
p:val1 p:hasScore 0.30 . 

p:val2 p:hasValue "Harry Potter" . 
p:val2 p:hasScore 0.90 . 

p:val3 p:hasValue "J. K. Rowling". 
p:val3 p:hasScore 0.90 . 

p:val4 p:hasValue "Joanne Rowling" . 
p:val4 p:hasScore 0.50 . 

Я хочу, чтобы построить другой граф с SPARQL запросом, только значение с лучшим счетом для каждого отдельного свойства. В этом примере, запрос должен вернуть это:

prefix p: <http://localhost/rdf/> 

p:set p:hasTitle p:val2 . 
p:set p:hasAuthor p:val3 . 

p:val2 p:hasValue "Harry Potter" . 
p:val2 p:hasScore 0.90 . 

p:val3 p:hasValue "J. K. Rowling" . 
p:val3 p:hasScore 0.90 . 

Пока я пытался что-то вроде этого:

PREFIX p: <http://localhost/rdf/> 

CONSTRUCT { 
    p:root p:hasSameAsSet ?saSet . 
    ?saSet ?prop ?bestVal . 
    ?bestVal ?p ?v 
} 

WHERE { 
    ?s p:hasSameAsSet ?saSet . 
    ?saSet ?prop ?val . 
    ?bestVal ?p ?v . 
    ?bestVal p:hasQualityScore ?m 
    { 
     SELECT (MAX(?score) AS ?m) 
     WHERE { 
      ?val p:hasQualityScore ?score 
     } GROUP BY ?prop 
    }  
} 

Я открывать SPARQL и я знаю, что я пропускаю важные вещи. Надеюсь, кто-то может мне помочь, спасибо вам большое! Если мой вопрос не ясен, я могу попытаться объяснить его лучше. Не волнуйтесь за свои ответы, я лучше читаю, чем писать;)

+2

Первый комментарий: сначала выполняются подвыборки, поэтому вам нужен тройной шаблон '? SaSet? Prop? Val .' внутри него. И вам нужно группировать «значение», чтобы вернуть его. Вам нужно вернуть '? Prop? Val' в подвыбор в дополнение к максимальному значению. – AKSW

ответ

2

Комментарий AKSW на месте. Ваш запрос очень близок, как есть, но сначала выполняется подзапрос, поэтому ему требуется достаточная информация, чтобы получить право группировки, и вам также нужно проецировать переменные изнутри, что позволит вам выполнить соединение с результатами внешнего запроса.

Например, запрос, как это получает вам максимальное значение для каждого свойства:

select ?prop (max(?val_) as ?val) { 
    ?sub ?prop ?val_ 
    } 
    group by ?prop 

Тогда вам просто нужно гнездо, что внутри внешнего запроса, который находит для каждого свойства и максимальное значение, тем при условии, что если бы это:

select ?sub ?prop ?val { 
    ?sub ?prop ?val 
    { select ?prop (max(?val_) as ?val) { 
     ?sub ?prop ?val_ 
     } 
     group by ?prop 
    } 
} 

(Обратите внимание, что может быть несколько значений суб, которые имеют максимальное значение?). Добавление любой дополнительной информации, что вам нужно в внешний запрос, а затем превратить его в запрос const не должен быть сложным, учитывая то, что вы уже получили в своем существующем запросе.

+0

Благодарим вас за полезный ответ. Но у меня есть проблема, чтобы реализовать его с моими данными: у меня есть структура, подобная этой: {: set: prop: val}. {: val: hasScore: score}, поэтому я хочу выбрать max: score group: prop, а не group by: hasScore. Я не знаю, как это сделать ... – Boustrophedon