使用SPARQL Update修改数据

时间:2016-05-09 11:15:27

标签: sql-update sparql

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

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

static foo_it_t * foo_if_t::new_instance()

我想要的是修改新值的旧值。我想我必须删除所有值并插入新值。我的第一个问题是我不知道或者我想我不关心旧值是什么,所以我只想修改新值的任何值(就像在SQL查询中一样) 。但是,我不知道如何指定它。我完全没有必要创建额外的SELECT查询来检索所有值,将它们存储在内存中并执行更新(看起来像很多负担和低效率,特别是对于大型查询)。我上面的查询只是插入,但不会删除任何内容,因为new_instanceDELETE { ?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 . } 没有绑定。

oldname绑定在参数化查询中。我认为olddesc条款可能为空(id),因为我不需要它。

有一种简单的方法吗?

修改

System.out.println查询:

WHERE

1 个答案:

答案 0 :(得分:3)

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

我不确定你的意思是“......因为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的绑定。