Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以在SPARQL查询中使用嵌套删除吗?_Sparql_Blank Nodes - Fatal编程技术网

可以在SPARQL查询中使用嵌套删除吗?

可以在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.

我想使用查询来使用唯一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
        }
    }
}
“因为创建的节点比删除的节点少”并不一定意味着不能使用普通的插入/删除。RDF是一种基于集合的表示;如果多次插入同一个三元组,则与插入一次相同。如果要规范化一组三元组,可以使用带参数的bnode为查询结果创建相同的空白节点:(添加了强调):

该函数构造一个与所有节点不同的空白节点 要查询的数据集中的空白节点,与所有空白节点不同 通过调用此构造函数为其他查询解决方案创建的节点。 如果使用无参数形式,则每次调用都会产生一个不同的 空白节点如果使用带有简单文本的表单,则每次调用 结果为不同的简单文本生成不同的空白节点,并且 相同的空白节点,用于调用中具有相同的简单文字 一个解决方案映射的表达式。

这意味着您可以执行以下操作:

插入{
?新邮件:帐户。
?新邮件:hasID?id。
?新RDF:标签?标签
}
删除{
?帐户邮件:hasId?id
}
在哪里{
账户a:邮件账户。
?帐户邮件:hasID?id。
?帐户RDF:标签?标签
#--为每个*不同的节点创建一个新的bnode*
#--?id值。如果两个帐户具有相同的
#--?id值,则它们将获得相同的bnode()。
绑定(bnode(str(?id))为新)
}
如果您试图将所有帐户合并为一个帐户,即使它们具有不同的ID,那么您可以将一个常量值传递到bnode函数中,例如

bind (bnode("") as ?new)

很好的解决方案。谢谢