首页 文章

在sparql中更新或创建数字计数器(UPSERT)

提问于
浏览
1

我想在rdf数据库(Blazegraph)中存储大量整数 . 需要使用新数据更新(递增)这些值,或者如果缺少,则创建这些值 . 在sparql 1.1中最好的方法是什么?如果我在SQL中使用它(MySQL/MariaDB),那就是这个,假设数据库最初是空的,并且表的唯一键设置为"s,p"(subject和谓词):

-- 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,并使其高效 .

1 回答

  • 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)
    }
    

相关问题