我正在使用SPARQL Update来执行通常的SQL更新查询。 SQL中的简单使SPARQL看起来有点不切实际。
所以我正在运行一个参数化查询:
static foo_it_t * foo_if_t::new_instance()
我想要的是修改新值的旧值。我想我必须删除所有值并插入新值。我的第一个问题是我不知道或者我想我不关心旧值是什么,所以我只想修改新值的任何值(就像在SQL查询中一样) 。但是,我不知道如何指定它。我完全没有必要创建额外的SELECT查询来检索所有值,将它们存储在内存中并执行更新(看起来像很多负担和低效率,特别是对于大型查询)。我上面的查询只是插入,但不会删除任何内容,因为new_instance
和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 .
}
没有绑定。
oldname
绑定在参数化查询中。我认为olddesc
条款可能为空(id
),因为我不需要它。
有一种简单的方法吗?
修改
System.out.println查询:
WHERE
答案 0 :(得分:3)
SPARQL在概念上与SQL不同,因为它使用不同类型的数据 - RDF图与基于表的关系数据。因此,您需要根据图形模式匹配来考虑SPARQL。这不是一个比另一个更容易的问题,而是必须理解不同的数据规范语言。 (基于XML的XPath是另一个例子 - 你需要考虑树中的路径,而不是关系表或图形。)
我不确定你的意思是“......因为oldname
和olddesc
没有约束力。” ?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
的绑定。