2015-12-15 62 views
1

我有一個芝麻三重商店,裏面輸入了本體。SPARQL UPDATE驗證

我知道我可以通過插入實例,刪除實例以及更新東西和東西來對其執行SPARQL更新操作。

但是,如果這些操作以錯誤的方式使用,例如插入無邏輯且不尊重本體規則的無效三元組,三重像:

foo:Anna foo:likesToEat foo:arsenic. 

而且本體看起來是這樣的:

@prefix foo: <http://www.foo.org/ontologies/example#>. 

foo:Anna rdf:type foo:Person. 
foo:Anna rdf:type owl:NamedIndividual. 
foo:Food rdf:type owl:Class. 
foo:Metal rdf:type owl:Class. 
foo:Person rdf:type owl:Class. 
foo:arsenic rdf:type foo:Metal. 
foo:arsenic rdf:type owl:NamedIndividual. 
foo:likesToEat rdf:type owl:ObjectProperty. 
foo:likesToEat rdfs:domain foo:Person. 
foo:likesToEat rdfs:range foo:Food. 
foo:pizza rdf:type foo:Food. 
foo:pizza rdf:type owl:NamedIndividual. 

正如你所看到的三重「富:安娜富:likesToEat富:砒霜門」是無效的,因爲OBJECTPROPERTY範圍不受尊重。

我的問題是:

有沒有驗證這些類型的最新的一種方式,因此,如果本體得到尊重更新操作將只執行?有沒有辦法設置三重商店來驗證這些事情,還是必須手動完成?

回答

2

正如你可以看到三重「foo:Anna foo:likesToEat foo:arsenic」是無效的,因爲objectProperty的範圍不受尊重。

這不是(RDF(S))本體的工作方式。從本體論的角度來看,這個三元組是完全有效的。 foo:likesToEat的範圍被定義爲類別foo:Food的事實僅意味着我們可以推斷foo:arsenicfoo:Food類型。你的本體中沒有任何東西使得這個無效或不一致:畢竟你沒有說任何東西都不是都是 a食物和金屬。

更一般地說:RDF Schema中的域/範圍語句並非關於「關閉」可以使用的屬性。 RDF的語義反過來:對屬性P的域/範圍限制指定如果某個人X使用屬性P,我們可以推斷X屬於域/範圍類P

芝麻中沒有內置功能來執行所要求的驗證,主要是出於這個原因。然而,如果你真的想,你當然可以實現一些拒絕或警告,當你插入一個三元組,你認爲無效(無論什麼原因)。根據您的使用情況,你有幾種選擇:

  1. 實現Sail(Connection)WrapperRepository(Connection)Wrapper攔截插入操作,並做必要的驗證。
  2. 實現了一個RDFHandler(例如RDFInserter的一個子類),它執行驗證,並使用該處理程序添加/驗證數據(而不是直接使用標準的RepositoryConnection.add方法)。

這兩種方法都允許您檢查每個傳入的三元組,在數據庫中爲其謂詞做一個快速查找,檢查是否存在域/範圍限制,以及三元組是否「違反」該限制引發錯誤。第二種方法可能是最容易做到的,也是最靈活的:您可以在代碼中的某些使用情況中使用此驗證,並且可以在您知道它不是必需的地方完全跳過它(因爲顯然,這種驗證會帶來性能損失)。

2

Jeen在描述RDFS或OWL如何在這種情況下發揮作用。

正如他所提到的,要執行驗證,您需要一個封閉的世界,這不是您通常使用RDFS或OWL語義獲得的東西。

這樣說,想要驗證您的數據是一個完全合理的事情要做! W3C試圖在這個area中定義一些東西,但是它還沒有被標準化。 iirc,TopBraid對它有一定的支持,但隨着工作組發展這一標準,它可能會變成一個動人的目標。我不知道是否有芝麻API,我認爲TopBraid使用耶拿,但它可能值得一看。

Stardog附帶Integrity Constraint Validation(教程可用here),這是使用OWL,SPARQL或規則進行數據驗證的另一種方法,作爲定義約束的語法。免責聲明是我在這方面的工作,但它是相關的,因爲a)它確實就像你正在尋找什麼,b)它支持Sesame API。