我想使用查询来使用唯一ID对资源进行重复数据删除。插入/删除 - 查询不起作用,因为必须创建的节点少于删除的节点。是否可以使用类似的东西?
insert {
?new a mails:Account.
?new mails:hasID ?id.
?new rdfs:label ?label
}
where {
{
select distinct ?id ?label where {
?account a mails:Account.
?account mails:hasID ?id.
?account rdfs:label ?label
}
}
bind(bnode() as ?new)
{
delete where {
?account mails:hasID ?id
}
}
}
答案 0 :(得分:1)
只是“因为必须创建的节点少于删除的节点”并不一定意味着您不能使用正常的插入/删除。 RDF是基于集合的表示;如果多次插入相同的三元组,则与插入一次相同。如果要标准化一组三元组,可以使用带参数的 bnode 为查询结果创建相同的空白节点:(强调添加):
BNODE函数构造一个与所有不同的空白节点 正在查询的数据集中的空白节点与所有空白区别 通过调用此构造函数为其他查询解决方案创建的节点。 如果使用无参数形式,则每个调用都会产生不同的结果 空白节点。 如果使用带有简单文字的表单,则每次调用 导致不同的简单文字的不同空白节点,以及 相同的空白节点,用于具有相同简单文字的调用 一个解决方案映射的表达式。
这意味着您可以:
insert {
?new a mails:Account.
?new mails:hasID ?id.
?new rdfs:label ?label
}
delete {
?account mails:hasId ?id
}
where {
?account a mails:Account.
?account mails:hasID ?id.
?account rdfs:label ?label
#-- One new bnode is created for each *distinct*
#-- ?id value. If two accounts have the same
#-- ?id value, then they will get the same bnode().
bind (bnode(str(?id)) as ?new)
}
如果您尝试将所有帐户合并为一个,即使它们具有不同的ID,您也可以将常量值传递到 bnode 函数,例如,
bind (bnode("") as ?new)