在SPARQL中插入数据时可以使用聚合函数吗?

时间:2017-01-10 18:27:38

标签: sparql rdf owl rdfs

我有以下查询,其目的是防止在三元组数量为给定数量时插入命名图形,例如5.

我尝试重现显示here的示例,其中可以插入数据,但我需要使用相同的命名图,最重要的是聚合函数,即COUNT。

INSERT 
  { 
    GRAPH <http://example/g1> { ?s ?p ?o } 
  }
WHERE
  { 
  GRAPH  <http://example/g1>
   { 
    ?s ?p ?o .
    FILTER ( COUNT(?p) < 5)
   } 
}  

Jena Fuseki提出以下错误:

 Aggregate expression not legal at this point

1 个答案:

答案 0 :(得分:2)

是的,这是可能的:

INSERT 
  { 
    GRAPH <http://example/g2> { ?s ?p ?o } 
  }
WHERE
{ 
  GRAPH <http://example/g1> {
    ?s ?p ?o .           # select all triples
    { SELECT ?s          # do a check for the selected subject
      WHERE { GRAPH <http://example/g1> { ?s ?p ?o } }
      GROUP BY ?s            # count properties per subject
      HAVING (COUNT(?p) < 5) # only subjects with less than 5 properties 
    }
  }
}

首先,聚合运算符不能放在FILTER子句中,要将它们用作条件,您必须将它们放在HAVING子句中。

此外,由于您要计算每个主题的属性,您必须使用GROUP BY ?s并使用子选择(检查主题属性数量的限制)并结合简单的模式匹配。

编辑请注意,我稍微修改了您的原始更新:它从您正在查询的图片中插入不同的命名图表。插入相同的命名图形当然会起作用,但结果将无法观察到(因为您只是插入了该图形中已存在的相同数据)。