使用 SPARQL 更新修改数据

Modify data with SPARQL Update

我正在使用 SPARQL 更新来执行通常的 SQL 更新查询。 SQL 中的简单之处使 SPARQL 看起来有点不切实际。

所以我是运行一个参数化查询:

DELETE { 
          ?id ex:name ?oldname .
          ?id ex:description ?olddesc .
       }
INSERT {  
          ?id ex:name "My new name" .
          ?id ex:description "My new description" .
}
WHERE { 
          ?id ex:name ?oldname .
}

我想要的是将旧值修改为新值。我想我必须删除所有值并插入新值。我的第一个问题是我不知道或者我想我不在乎旧值是什么,所以我只想修改新值的任何值(就像在 SQL 查询中一样) .但是我不知道如何指定它。我认为不必创建额外的 SELECT 查询来检索所有值,将它们存储在内存中并执行更新(似乎负担很大且效率低下,尤其是对于大型查询)毫无意义。我上面的查询只是插入,但没有删除任何内容,因为 oldnameolddesc 没有绑定。

id 绑定在参数化查询中。我想 WHERE 子句可以是空的 (WHERE {}),因为我不需要它。

有没有简单的方法可以做到这一点?


编辑

System.out.println查询:

DELETE { ?id ex:name ?oldname .
        ?id rdfs:label ?oldlabel .
        ?id ex:description ?olddesc .
       } INSERT { ?id ex:name ?name .
                 ?id rdfs:label ?name .
                 ?id ex:description ?desc .
                }
       WHERE { OPTIONAL { ?id ex:name ?oldname }
              OPTIONAL { ?id rdfs:label ?oldlabel }
              OPTIONAL { ?id ex:description ?olddesc }
             }
# Overrides by the API: 
# PARAMETERS ( ?name ?id ?desc ) {
# "NewName"
# <http://example.com/test#doc64>
# "FaldosX"
# }

SPARQL 在概念上不同于 SQL,因为它使用不同类型的数据 - RDF 图与基于 table 的关系数据。因此,您需要从图形模式匹配的角度来考虑 SPARQL。这不是一个比另一个更容易的问题,而是必须理解不同的数据规范语言。 (XML 上的 XPath 是另一个示例 - 您需要根据树中的路径来思考,而不是关系 table 或图形。)

我不确定您所说的“...因为 oldnameolddesc 未绑定。”是什么意思。 ?oldname 绑定在查询的 WHERE 子句中。所以解决方案非常接近:

DELETE { 
   ?id ex:name ?oldname .
   ?id ex:description ?olddesc .
 }
INSERT {  
   ?id ex:name "My new name" .
   ?id ex:description "My new description" .
}
WHERE { 
   ?id ex:name ?oldname .
   OPTIONAL {
      ?id ex:description ?olddesc .
   }
}

我添加了 OPTIONAL 以防并非所有 ?id 的绑定都有 ex:description

同样,这里的原理和SQL类似——需要指定要替换的数据。这是通过查询现有数据、删除它并指定新数据来完成的。

请注意,语法足够灵活,也可以替换特定数据。假设 ex:description 有多个值。然后以下将替换指定的值并保留其他值。

DELETE {
   ?id ex:description "One old value" .
 }
INSERT {
   ?id ex:description "My new description" .
}
WHERE { 
   ?id ex:description "One old value" .
}

请注意 WHERE 子句仍然是必需的,因为您需要找到 ?id.

的绑定