可以在SPARQL查询中使用嵌套删除吗?
我想使用查询来使用唯一id消除资源的重复数据。插入/删除-查询不起作用,因为创建的节点比删除的节点少。有可能使用类似的东西吗可以在SPARQL查询中使用嵌套删除吗?,sparql,blank-nodes,Sparql,Blank Nodes,我想使用查询来使用唯一id消除资源的重复数据。插入/删除-查询不起作用,因为创建的节点比删除的节点少。有可能使用类似的东西吗 insert { ?new a mails:Account. ?new mails:hasID ?id. ?new rdfs:label ?label } where { { select distinct ?id ?label where { ?account a mails:Account.
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
}
}
}
“因为创建的节点比删除的节点少”并不一定意味着不能使用普通的插入/删除。RDF是一种基于集合的表示;如果多次插入同一个三元组,则与插入一次相同。如果要规范化一组三元组,可以使用带参数的bnode为查询结果创建相同的空白节点:(添加了强调):
该函数构造一个与所有节点不同的空白节点
要查询的数据集中的空白节点,与所有空白节点不同
通过调用此构造函数为其他查询解决方案创建的节点。
如果使用无参数形式,则每次调用都会产生一个不同的
空白节点如果使用带有简单文本的表单,则每次调用
结果为不同的简单文本生成不同的空白节点,并且
相同的空白节点,用于调用中具有相同的简单文字
一个解决方案映射的表达式。
这意味着您可以执行以下操作:
插入{
?新邮件:帐户。
?新邮件:hasID?id。
?新RDF:标签?标签
}
删除{
?帐户邮件:hasId?id
}
在哪里{
账户a:邮件账户。
?帐户邮件:hasID?id。
?帐户RDF:标签?标签
#--为每个*不同的节点创建一个新的bnode*
#--?id值。如果两个帐户具有相同的
#--?id值,则它们将获得相同的bnode()。
绑定(bnode(str(?id))为新)
}
如果您试图将所有帐户合并为一个帐户,即使它们具有不同的ID,那么您可以将一个常量值传递到bnode函数中,例如
bind (bnode("") as ?new)
很好的解决方案。谢谢