在sparql中更新或创建数字计数器(UPSERT)
我想在rdf数据库(Blazegraph)中存储大量整数。这些值需要用新数据更新(递增),或者如果丢失,则创建新数据。在sparql 1.1中,最好的方法是什么?如果我是在SQL()中编写的,那么假设数据库一开始是空的,并且表的唯一键设置为“s,p”(主语和谓语): 生成的RDF数据:在sparql中更新或创建数字计数器(UPSERT),sparql,blazegraph,Sparql,Blazegraph,我想在rdf数据库(Blazegraph)中存储大量整数。这些值需要用新数据更新(递增),或者如果丢失,则创建新数据。在sparql 1.1中,最好的方法是什么?如果我是在SQL()中编写的,那么假设数据库一开始是空的,并且表的唯一键设置为“s,p”(主语和谓语): 生成的RDF数据: :A :cnt 10 . :B :cnt 1 . :A :cnt 13 . :B :cnt 1 . :C :cnt 5 . 下次运行: -- Inserting or addin
:A :cnt 10 .
:B :cnt 1 .
:A :cnt 13 .
:B :cnt 1 .
:C :cnt 5 .
下次运行:
-- Inserting or adding A=3, C=5
INSERT INTO tbl (s,p,o) VALUES ('A','cnt',3), ('C','cnt',5)
ON DUPLICATE KEY UPDATE o=o+VALUES(o);
生成的RDF数据:
:A :cnt 10 .
:B :cnt 1 .
:A :cnt 13 .
:B :cnt 1 .
:C :cnt 5 .
因此,问题是-如何构造SPARQL查询以基于现有数据和增量执行批量UPSERT,并使其高效。前缀:
PREFIX : <http://example.org/>
DELETE { ?letter :cnt ?outdated }
INSERT { ?letter :cnt ?updated }
WHERE {
VALUES (?letter ?increment) { (:A 10) (:B 1) }
OPTIONAL { ?letter :cnt ?outdated }
BIND ((IF(BOUND(?outdated), ?outdated + ?increment, ?increment)) AS ?updated)
}
删除{字母:cnt?过时}
插入{字母:cnt?更新}
在哪里{
值(?字母?增量){(:a10)(:b1)}
可选{?字母:cnt?过时}
绑定((如果(绑定(?过期),?过期+增量,?增量))为更新)
}
您可以使用查询-事实上,我无法在不查看数据的情况下为您提供任何查询信息。感谢您的回复,我已更新了问题以澄清我需要什么。谢谢最初的问题是。另请参见“请仔细测试”。