2012-04-09 99 views
7

我的問題是類似於被要求在此線程Is it possible to combine those 2 SPARQL INSERT into one?多SPARQL「地方插入」在一個請求查詢

我想有多個INSERT語句的WHERE查詢中,但對於不同的主題。 我想測試一個特定的值(「testValueN」),如果有的話想插入一個新的三元組。

它的一個例子是,

PREFIX Sensor: <http://example.com/Equipment.owl#> 
{ 
    INSERT { 
     ?subject1 Sensor:test2 'newValue1' . 
      } 
    WHERE { 
     ?subject1 Sensor:test1 'testValue1' . 
      } 
}; 
{ 
    INSERT { 
     ?subject2 Sensor:test2 'newValue2' . 
      } 
    WHERE { 
     ?subject2 Sensor:test1 'testValue2' . 
      } 
}; 

我知道上面的查詢是錯誤的。我想知道在SPARQL中是否有類似的可能。

回答

8

是的,這是可能的。事實上,你的例子是幾乎完全沒事,只是失去了架,每一個刀片周圍:

PREFIX Sensor: <http://example.com/Equipment.owl#> 
INSERT { 
    ?subject1 Sensor:test2 'newValue1' . 
} 
WHERE { 
    ?subject1 Sensor:test1 'testValue1' . 
}; 
INSERT { 
    ?subject2 Sensor:test2 'newValue2' . 
} 
WHERE { 
    ?subject2 Sensor:test1 'testValue2' . 
} 

是一個有效的SPARQL更新序列。

+0

它工作!謝謝Jeen 我跑了一個批量更新100,然後1000使用上述查詢三元組。隨着我不斷增加三元組的數量,更新變得非常緩慢。 對於100 INSERT WHERE更新需要4.2秒和 1000 INSERT WHERE更新需要40.7秒 這是做批量INSERT WHERE更新的正確和最有效的方法嗎? – Nikhil 2012-04-10 22:22:48

+0

我不這麼認爲,我猜測在單次更新中這樣做效率要高很多,而不是每個單獨值更新的序列。但是,這是一個單獨的問題,需要更多關於數據的詳細信息,以及您準備實現的內容:) – 2012-04-10 23:12:28

+0

我試圖將傳感器讀數批量插入符合SPARQL 1.1的RDF存儲中。我得到一串讀數和相應的傳感器ID。我需要查找傳感器ID獲取該傳感器的URI,如果存在,則插入傳感器測量值。 所以我需要首先做一個查找然後一個插入。預取傳感器URI可能不太好,因爲更新將來自不同的機器,傳感器的數量應該擴展到一百萬甚至更多。如果我在正確的軌道上,請告訴我。 – Nikhil 2012-04-13 06:01:32

0

我想在查詢中有多個INSERT WHERE語句,但對於不同的主題。我想測試一個特定的值(「testValueN」),如果存在的話想插入一個新的三重主題。

你可以做到這一點使用指定你想要的屬性oldValue/NEWVALUE對,而且只需要一個插入。它還可以更好地擴展到新對,因爲您只需向查詢添加一行即可。

PREFIX Sensor: <http://example.com/Equipment.owl#> 
INSERT { 
    ?subject Sensor:test2 ?newValue 
} 
WHERE { 
    values (?oldValue ?newValue) { 
     ('testValue1' 'newValue1') 
     ('testValue2' 'newValue2') 
    } 
    ?subject Sensor:test1 ?oldValue 
}