2017-06-23 34 views
2

我的團隊正在實施Ceusters's Referent Tracking的變體。在我們的實現中,實體的原始URI可以更改(包含UUID),但始終保留原始URI的鏈接。比較模型的身份,但與變量?構造與減號?

例如:

:Joey rdf:type :person . 
:New_York_City rdf:type :locality . 
:Joey :hometown :New_York_City . 

可能變成:

:Joey :replacedWith :ABC123 . 
:ABC123 rdf:type :person . 
:New_York_City :replacedWith :FFF555 . 
:FFF555 rdf:type :locality . 
:ABC123 :hometown :FFF555 . 

我寫一些Scala的集成測試,看看我們的軟件確實指涉正確跟蹤。

具體來說,我知道我應該想到這CorrectPattern

:Joey :replacedWith ?person . 
?person rdf:type :person . 
:New_York_City :replacedWith ?locale . 
?locale rdf:type :locality . 
?person :hometown ?locale . 

但我不知道?person?locale的價值觀是什麼。

我可以SPARQL ASK對於CorrectPattern ...這將告訴我,如果模式存在。但我也想確認沒有其他東西被添加

我以爲我可以CONSTRUCT { ?s ?p ?o }MINUSCorrectPattern,並檢查是否有一個空的結果,但Blazegraph是說:

java.util.concurrent.ExecutionException:org.openrdf.query.MalformedQueryException:構造物,其中只允許WHERE子句中的語句模式。

任何想法?我想檢查一下,整個三重商店只包含CorrectPattern,但我認爲CorrectPattern必須包含變量。

+1

爲了使用高級功能,您必須將其包裝到一個'SELECT'子句中。 – AKSW

+0

@AKSW ...你是否認爲如果我想插入包含now()這樣的SPARQL函數的數據,我應該可以做一個類似的包裝'select'?我無法獲得包含'bind(now()as?insertDate)'的'insert data'語句來工作。 –

+0

像https://stackoverflow.com/questions/41575837/it-is-possible-to-use-aggregate-function-when-inserting-data-in-sparql –

回答

1

爲了確定三重存儲只包含您期望的三元組,並且沒有更多,您可以測試您期望的確切三元組,同時計算您之前和之後出現在數據庫中的三元組的數量運行你的程序。如果三元組的差異高於或低於您的預期,您將知道您有一些無關或缺失的數據。

使用SPARQL SELECT計數功能:

SELECT (count(?triples) as ?count) 
WHERE { 
?triples ?p ?o .} 

僞代碼:

val beforeTripleCount = countTriplesInDatabase() 
//run your program, test for expected triples 
val afterTripleCount = countTriplesInDatabase() 
val diff = afterTripleCount - beforeTripleCount 
//diff should be equal to the number of triples you expect to be added/removed 

此外,如果您是在測試中使用的變量性,你可以寫其他查詢捕捉到的URI您創建的節點,然後使用字符串連接將結果添加到測試查詢中。

3

再次受到@AKSW評論的譴責,他似乎並不特別沉迷於贏得聲望點。

這個CONSTRUCT(帶有嵌入的SELECT)從我的模型中獲取所有三元組,即使它們包含變量,也會耗盡MINUS塊中的任何三元組。我很確定我可以充實MINUS區塊並完成我的任務。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
CONSTRUCT 
    { 
    ?s ?p ?o . 
    } 
WHERE 
    { SELECT ?s ?p ?o 
    WHERE 
     { { ?s ?p ?o } 
     MINUS 
      { ?s rdf:type ?o } 
     } 
    }