【问题标题】:Update or create numeric counters in sparql (UPSERT)在 sparql (UPSERT) 中更新或创建数字计数器
【发布时间】:2017-09-04 05:01:57
【问题描述】:

我想在 rdf 数据库 (Blazegraph) 中存储大量整数。这些值需要用新数据更新(增加),或者如果丢失,则创建。在 sparql 1.1 中最好的方法是什么?如果我在 SQL (MySQL/MariaDB) 中编写它,假设数据库一开始是空的,并且表的唯一键设置为“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,并使其高效。

【问题讨论】:

标签: sparql blazegraph


【解决方案1】:
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)
}

【讨论】:

  • 请仔细测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多