在SPARQL IN子句中使用另一个SPARQL [英] use another sparql inside sparql IN clause

查看:15
本文介绍了在SPARQL IN子句中使用另一个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.}
}

所以我需要添加一个额外的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略有不同,只能在类似于FILTERFILTER中使用:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆