在sparql IN子句中使用另一个sparql

Soh*_*deh 7 sparql

我正在使用SPARQL,我想知道我是否可以在子句中放入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.}
}
Run Code Online (Sandbox Code Playgroud)

所以我需要像这样添加一个额外的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) 
             }
       }
 }
Run Code Online (Sandbox Code Playgroud)

但是我在sparql查询解析器上遇到错误.....有谁知道如何修复它?

Rob*_*obV 7

INSPARQL中的用法与SQL略有不同,它只能在FILTER类似的内容中使用:

FILTER(?s IN (<this>, <that>, <another>))
Run Code Online (Sandbox Code Playgroud)

但是,由于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) 
  }
}
Run Code Online (Sandbox Code Playgroud)

您可能会注意到我也简化了查询的其他部分.无需使用两个嵌套的子查询,因为您可以使用该HAVING子句指定聚合条件.

此外,您不需要放置{ }每个单独的三重模式,实际上这样做可能会严重损害性能.