2017-09-04 8 views
1

많은 수의 정수를 rdf 데이터베이스 (Blazegraph)에 저장하고 싶습니다. 이러한 값은 새 데이터로 업데이트 (증가)되거나 누락 된 경우 작성해야합니다. sparql 1.1에서 그렇게하는 가장 좋은 방법은 무엇입니까?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); 

: 나는 SQL (MySQL/MariaDB)에서 그것을 wrtiting 경우, 데이터베이스를 가정하는 것은 처음에는 비어 있으며 테이블의 고유 키 (주어와 술어) "S, P"로 설정이 될 것입니다 결과 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 . 

그래서 질문은 - 기존 데이터 및 증분을 기반으로 대량 UPSERT를 수행하고이를 효율적으로 만드는 SPARQL 쿼리를 작성하는 방법입니다.

+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) 
} 
당신은 [SPARQL 1.1 업데이트]를 사용할 수 있습니다
+1

을주의 깊게 테스트하십시오. –

+0

테스트를 거쳤습니다. 감사합니다. – Yurik