2017-09-04 18 views
1

我想在rdf數據庫(Blazegraph)中存儲大量整數。這些值需要用新數據更新(增加),或者如果缺失,則創建。什麼是在sparql 1.1中做到這一點的最佳方式?如果我是在SQL(MySQL/MariaDB)wrtiting它,它會是這樣,假設數據庫是空的,在第一,並表的唯一鍵設置爲「S,P」(主語和謂語):在sparql中更新或創建數值計數器(UPSERT)

-- 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查詢以基於現有數據和增量執行bulk UPSERT,並使其效率更高。

+1

您可以使用[SPARQL 1.1更新](https://www.w3.org/TR/sparql11-update/)查詢 - 事實上,我不能給你任何想法的查詢沒有看到數據 – AKSW

+0

感謝您的回覆,我已經更新了這個問題,以澄清我需要什麼。謝謝!! – Yurik

+0

最初的問題是https://phabricator.wikimedia.org/T174981。另請參閱https://stackoverflow.com/q/39438022/7879193 –

回答

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) 
} 
+1

請仔細測試。 –

+0

測試過,效果很好,謝謝! – Yurik