Sparql - 如何通过选择按属性分组的对象的MAX值来构造RDF?

时间:2016-06-16 15:19:13

标签: sparql rdf

抱歉这个不起眼的头衔,我是法国人,我不知道如何揭露我的问题。我认为解释它的最好方法是举个例子。

我有一些像这样的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,我知道我错过了重要的事情。我希望有人可以帮助我,非常感谢你!如果我的问题不清楚,我可以尝试更好地解释它。不要为你的答案担心,我在阅读方面比写作更好;)

1 个答案:

答案 0 :(得分: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
    }
}

(请注意,?sub 的多个值可能具有最大值。)向外部查询添加所需的任何额外信息,然后将其转换为 constuct < / strong>查询不应该很难,因为你已经在现有查询中得到了什么。