是否可以在 WHERE 子句中使用 FILTER(COUNT(DISTINCT ?obj) > x) 执行 SPARQL DELETE{} WHERE{}?

Is it possible to do a SPARQL DELETE{} WHERE{} with a FILTER(COUNT(DISTINCT ?obj) > x) in the WHERE clause?

我想实现删除,删除每个主题少于 x 个不同对象的所有三元组。

根据我的感觉,预期的查询应该如下所示:

DELETE { ?sub ?pred ?obj . } 
WHERE {  
    {SELECT ?sub ?pred ?obj (count(?obj) as ?count)
    WHERE { ?sub ?pred ?obj .
        } GROUP BY ?sub
    } FILTER(?count < 14)
}

上面的不行。

还需要 GROUP BY 才能实现每个 ?sub 部分的 ?obj,但我不知道该怎么做。

有人可以指导我正确的方向来解决这个任务吗?

请注意,您的子查询实际上不是合法查询。如果您尝试仅验证 sparql.org's query validator 上的子查询,您将得到以下输出:

Syntax error:

Non-group key variable in SELECT: ?pred

但是,奇怪的是,整个查询 通过 update validator 验证。从您尝试的查询中并不能完全清楚您要删除的内容以及声明:

I want to achieve a delete which deletes all triples where there are less than x distinct objects per subject.

也没有说清楚。如果你试图删除一个主题与少于 10 个不同对象相关的三元组,超过 all 与该主题一起使用的谓词,你会发现它们是这样的:

select ?s ?p ?o {
  ?s ?p ?o 
  { select ?s { ?s ?pp ?oo }
    group by ?s
    having (count(distinct ?oo) < 10) }
}

然后,将其扩展为执行删除很容易:

delete { ?s ?p ?o }
where {
  ?s ?p ?o 
  { select ?s { ?s ?pp ?oo }
    group by ?s
    having (count(distinct ?oo) < 10) }
}