是否可以在 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) }
}
我想实现删除,删除每个主题少于 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) }
}