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

标签 sparql

我正在使用 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 有所不同,它只能在 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 - 在 sparql IN 子句中使用另一个 sparql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650840/

相关文章:

sparql - 如何检查从 SPARQL * 通配符扩展的所有级别的子属性?

java - Fuseki - 服务器配置

sparql - 为空属性生成值

SPARQL 可选查询

web - 删除查询 SPARQL FUSEKI

java - 使用 sparql 查询向 Fuseki 插入数据

sparql - 使用SPARQL查询RDF数据库中的多态性

sparql - Fuseki中TBox和ABox与TDB和Pubby的分离

sparql - DBpedia SPARQL 过滤器不适用于所有结果

sparql - 关于 SPARQL 中的 UNION 和 FILTER NOT EXISTS (OpenRDF 2.8.0)