在SPARQL IN子句中使用另一个SPARQL [英] use another sparql inside sparql IN clause
本文介绍了在SPARQL IN子句中使用另一个SPARQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
select
?s1 ?x ?s2.
WHERE {
{?s1 rdf:type dbpedia-owl:Scientist.}
{?s2 rdf:type dbpedia-owl:Scientist.}
{?s2 dbpedia-owl:field ?x.}
{?s1 dbpedia-owl:field ?x.}
}
所以我需要添加一个额外的IN子句,如下所示
SELECT
?s1 ?x ?s2.
WHERE {
{?s1 rdf:type dbpedia-owl:Scientist.}
{?s2 rdf:type dbpedia-owl:Scientist.}
{?s2 dbpedia-owl:field ?x.}
{?s1 dbpedia-owl:field ?x.}
{?s1 IN
{
SELECT ?s1 WHERE {
SELECT ?s1 (COUNT(?p) AS ?prizes) {
?s1 dbpprop:prizes ?p.
} group by (?s1)
}FILTER (?prizes > 2)
}
}
}
但我在SPARQL查询解析器上出错.
有人知道如何修复它吗?
推荐答案
IN
在SPARQL中的用法与sql略有不同,只能在类似于FILTER
的FILTER
中使用:
FILTER(?s IN (<this>, <that>, <another>))
但是,由于SPARQL求值的自下而上联接语义:
,因此仅使用子查询本身就可以获得所需的结果:SELECT ?s1 ?x ?s2
WHERE
{
?s1 rdf:type dbpedia-owl:Scientist.
?s2 rdf:type dbpedia-owl:Scientist.
?s2 dbpedia-owl:field ?x.
?s1 dbpedia-owl:field ?x.
{
SELECT ?s1 WHERE
{
?s1 dbpprop:prizes ?p.
}
GROUP BY ?s1
HAVING (COUNT(?p) > 2)
}
}
您可能注意到,我还简化了查询的其他一些部分。不需要使用两个嵌套子查询,因为您可以使用HAVING
子句指定聚合条件。
此外,您不需要将{ }
放在每个单独的三元模式周围,事实上,这样做可能会严重影响性能。
这篇关于在SPARQL IN子句中使用另一个SPARQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文