我正在使用 SPARQL,我想知道是否可以在 in 子句中放入 sparql ?
更具体地说,我需要获取具有此 sparql 查询特定条件的实体(s1,s2)[s1 在某个字段上的聚合值大于 5]
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 有所不同,它只能在 SQL 中使用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
clause.
你也不需要把{ }
围绕每个单独的三重模式,事实上这样做可能会严重损害性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)