使用 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 查询来检索所有值,将它们存储在内存中并执行更新(似乎负担很大且效率低下,尤其是对于大型查询)毫无意义。我上面的查询只是插入,但没有删除任何内容,因为 oldname
和 olddesc
没有绑定。
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 或图形。)
我不确定您所说的“...因为 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
.
的绑定
我正在使用 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 查询来检索所有值,将它们存储在内存中并执行更新(似乎负担很大且效率低下,尤其是对于大型查询)毫无意义。我上面的查询只是插入,但没有删除任何内容,因为 oldname
和 olddesc
没有绑定。
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 或图形。)
我不确定您所说的“...因为 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
.