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

时间:2016-06-29 09:27:14

标签: sparql virtuoso

我想实现一个删除操作,删除每个主题少于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来实现?obj?sub部分,但我无法知道如何执行此操作。

有人可以推动我朝着正确的方向解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

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

  

语法错误:

     

SELECT中的非组键变量:?pred

但奇怪的是,整个查询 验证了update validator。从您尝试的查询中确切地说您要删除的内容以及声明:

并不完全清楚
  

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

也不是很清楚。如果您尝试删除三个主题与三个不同的对象相关的三元组,而所有与该主题一起使用的谓词,您会发现它们是这样的:

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) }
}