我有以下查询,其目的是防止在三元组数量为给定数量时插入命名图形,例如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
答案 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
并使用子选择(检查主题属性数量的限制)并结合简单的模式匹配。
编辑请注意,我稍微修改了您的原始更新:它从您正在查询的图片中插入不同的命名图表。插入相同的命名图形当然会起作用,但结果将无法观察到(因为您只是插入了该图形中已存在的相同数据)。