我想实现一个删除操作,删除每个主题少于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
部分,但我无法知道如何执行此操作。
有人可以推动我朝着正确的方向解决这个问题吗?
答案 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) }
}