在 sparql (UPSERT) 中更新或创建数字计数器
Update or create numeric counters in sparql (UPSERT)
我想在 rdf 数据库 (Blazegraph) 中存储大量整数。这些值需要用新数据更新(增加),或者如果缺少,则创建。在 sparql 1.1 中最好的方法是什么?如果我在 SQL (MySQL/MariaDB) 中编写它,它会是这样的,假设数据库一开始是空的,并且 table 的唯一键设置为 "s,p"(主语和谓语):
-- Inserting or adding A=10, B=1
INSERT INTO tbl (s,p,o) VALUES ('A','cnt',10), ('B','cnt',1)
ON DUPLICATE KEY UPDATE o=o+VALUES(o);
生成的 RDF 数据:
:A :cnt 10 .
:B :cnt 1 .
下一个运行:
-- 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 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)
}
我想在 rdf 数据库 (Blazegraph) 中存储大量整数。这些值需要用新数据更新(增加),或者如果缺少,则创建。在 sparql 1.1 中最好的方法是什么?如果我在 SQL (MySQL/MariaDB) 中编写它,它会是这样的,假设数据库一开始是空的,并且 table 的唯一键设置为 "s,p"(主语和谓语):
-- Inserting or adding A=10, B=1
INSERT INTO tbl (s,p,o) VALUES ('A','cnt',10), ('B','cnt',1)
ON DUPLICATE KEY UPDATE o=o+VALUES(o);
生成的 RDF 数据:
:A :cnt 10 .
:B :cnt 1 .
下一个运行:
-- 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 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)
}