如何通过 SPARQL 为更新生成 UUID
How to generate UUIDs for updates via SPARQL
使用通过 SPARQL 端点访问的 RDF 数据库,生成新 UUID IRI 并将其用于新资源的最佳方法是什么?
以下是我尝试过的一些方法的概述。我分享这个是因为我希望找到这个问题的答案。我最喜欢的是最后一种方法,但我认为它仍有待商榷。
在客户端生成一个 UUID 并在更新请求中使用它
- 亲:快
- con: 你不能确定 UUID 在数据库中是唯一的。不过,发生碰撞的可能性很小。
在客户端生成一个 UUID 并检查 RDF 存储是否包含具有该 ID 的三元组。迭代直到UUID是新的。
- 亲:你可以合理地确定UUID在数据库中是唯一的(并发更新中添加的除外)
- 缺点:相当慢
向 RDF 存储询问 UUID 并使用它
查询:SELECT (UUID() as ?id) WHERE{}
- 亲:UUID保证在商店中是唯一的(即尚未使用)
- 缺点:这是一个额外的请求(但很快)
在进行大量更新之前向 RDF 存储询问 N >> 1 个 UUID
查询(returns 1000 个结果行):
SELECT (UUID() as ?id) WHERE {
VALUES ?index1 { 0 1 2 3 4 5 6 7 8 9 }
VALUES ?index2 { 0 1 2 3 4 5 6 7 8 9 }
VALUES ?index3 { 0 1 2 3 4 5 6 7 8 9 }
}
- 专业版:如果需要 >> 1,每个 UUID 可能最快
- pro: UUID保证在商店中未被使用
- 缺点:这种方法需要更多的客户端编程
- and: 这是一个不寻常的查询,有没有更好的方法来实现它?
相关:
- How to use Jena SPARQL UUID?
- SPARQL CONSTRUCT+INSERT
遵循 AndyS's comment, I decided to look that up again 并调整我的预期:您必须在大约 85 年内每秒生成 10 亿个 UUID,才能达到 50% 的发生一次或多次冲突的概率。因此,变体 1 是最好的:
在客户端生成一个UUID并在更新请求中使用它。
使用通过 SPARQL 端点访问的 RDF 数据库,生成新 UUID IRI 并将其用于新资源的最佳方法是什么?
以下是我尝试过的一些方法的概述。我分享这个是因为我希望找到这个问题的答案。我最喜欢的是最后一种方法,但我认为它仍有待商榷。
在客户端生成一个 UUID 并在更新请求中使用它
- 亲:快
- con: 你不能确定 UUID 在数据库中是唯一的。不过,发生碰撞的可能性很小。
在客户端生成一个 UUID 并检查 RDF 存储是否包含具有该 ID 的三元组。迭代直到UUID是新的。
- 亲:你可以合理地确定UUID在数据库中是唯一的(并发更新中添加的除外)
- 缺点:相当慢
向 RDF 存储询问 UUID 并使用它
查询:SELECT (UUID() as ?id) WHERE{}
- 亲:UUID保证在商店中是唯一的(即尚未使用)
- 缺点:这是一个额外的请求(但很快)
在进行大量更新之前向 RDF 存储询问 N >> 1 个 UUID
查询(returns 1000 个结果行):
SELECT (UUID() as ?id) WHERE {
VALUES ?index1 { 0 1 2 3 4 5 6 7 8 9 }
VALUES ?index2 { 0 1 2 3 4 5 6 7 8 9 }
VALUES ?index3 { 0 1 2 3 4 5 6 7 8 9 }
}
- 专业版:如果需要 >> 1,每个 UUID 可能最快
- pro: UUID保证在商店中未被使用
- 缺点:这种方法需要更多的客户端编程
- and: 这是一个不寻常的查询,有没有更好的方法来实现它?
相关:
- How to use Jena SPARQL UUID?
- SPARQL CONSTRUCT+INSERT
遵循 AndyS's comment, I decided to look that up again 并调整我的预期:您必须在大约 85 年内每秒生成 10 亿个 UUID,才能达到 50% 的发生一次或多次冲突的概率。因此,变体 1 是最好的:
在客户端生成一个UUID并在更新请求中使用它。