抱歉这个不起眼的头衔,我是法国人,我不知道如何揭露我的问题。我认为解释它的最好方法是举个例子。
我有一些像这样的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,我知道我错过了重要的事情。我希望有人可以帮助我,非常感谢你!如果我的问题不清楚,我可以尝试更好地解释它。不要为你的答案担心,我在阅读方面比写作更好;)
答案 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>查询不应该很难,因为你已经在现有查询中得到了什么。