9

我正在使用 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 查询解析器上遇到错误.....有人知道如何解决它吗?

4

3 回答 3

7

INSPARQL 在 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子句指定聚合条件。

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

于 2012-11-30T18:34:09.227 回答
3

根据官方W3C文档,

boolean  rdfTerm IN (expression, ...)

IN 运算符测试是否在右侧的表达式列表的值中找到左侧的 RDF 项。测试使用“=”运算符完成,该运算符测试相同的值,由运算符映射确定。

右侧的零项列表是合法的。

如果正在测试的 RDF 术语在术语列表的其他位置没有找到,则比较错误会导致 IN 表达式引发错误。

IN 运算符等价于 SPARQL 表达式:

(lhs = 表达式1) || (lhs = 表达式2) || ...

例子:

在此处输入图像描述

因此,IN运算符接受vales 列表,当我们使用 select 运算符(如您的示例所示)使用嵌套 SPARQL 查询时,它返回Resultset,您可以将其视为语句列表。因此你不能那样做。

但是下面是一个示例,您可以按照 SPARQL FILTER +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.}
      FILTER (?s1 IN (<http://example.com/#1>,<http://example.com/#2>, <http://example.com/#3>)) 
 }
于 2018-03-29T04:06:38.300 回答
0

您可能想尝试 FILTER(EXISTS ...)

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.}
      FILTER (EXISTS {
        SELECT ?sx
        WHERE {
          {
            SELECT ?sx (COUNT(?p) AS ?prizes) 
            {?sx dbpprop:prizes ?p.}
            GROUP BY ?sx
            HAVING (?prizes > 2)
          } .
          FILTER(?sx = ?s1)
        }
      })
 }
于 2020-02-12T22:04:49.860 回答