2013-06-26 82 views
1

如何比較兩個RDF圖與SPARQL?如果我有圖表:a和:b,我想查找所有時間:a出現在:b。我可以查詢所有:a的主題,謂詞和對象,然後以編程方式構建一個模式查詢,以匹配:a中的模式:b。有沒有一種方法可以構建:SPARQL中的所有模式查詢,而不需要編程構造?比較SPARQL圖

+3

這是你所提到的「SPARQL圖」的第二個問題。哪有這回事; SPARQL是RDF圖的查詢語言(即,三元組集合)。如果你有一個RDF圖_A_,那麼它既可以是_B_的子圖,也可以是_isn't_;沒有一種感覺可以多次出現。 [有一個RDF蘊含的概念,其中空白節點是可以實例化的變量,所以它可能是一個圖形需要多個替換,但這幾乎不是你要求的,我認爲。] –

+0

謝謝,更正。我打算在以下位置查找多個a的結構實例:b。 – NargothBond

+0

你如何擁有這些圖表?你提到你不想以編程方式做這件事,但這些圖表在哪裏?他們是否在SPARQL端點中命名圖表?文件在某個磁盤上?如果兩個圖形在端點上被命名爲圖形,則可能可以執行某些操作。 –

回答

6

我建立了一個Jena Fuseki端點,其中包含兩個命名圖形http://ahttp://b,我們將其稱爲A和B.A包含一個三元組,B包含兩個。 A,(看)爲一組三元的,是B的一個子集,它下面的查詢確認:

select * where { 
    graph ?g { ?s ?p ?o } 
} 

----------------------------------------------------------- 
| s   | p   | o   | g   | 
=========================================================== 
| <urn:uuid:b> | <urn:uuid:p> | <urn:uuid:b> | <http://b> | 
| <urn:uuid:a> | <urn:uuid:p> | <urn:uuid:b> | <http://b> | 
| <urn:uuid:a> | <urn:uuid:p> | <urn:uuid:b> | <http://a> | 
----------------------------------------------------------- 

現在,我們可以要求出現在一個而不是在其他三元。要問三重B中不在A,我們可以利用這個查詢:

select * where { 
    graph <http://a> { ?s ?p ?o } 
    NOT EXISTS { graph <http://b> { ?s ?p ?o } } 
} 

------------- 
| s | p | o | 
============= 
------------- 

我們也可以要求出現B中三元,而不是在答:我們希望並獲得一個三。

select * where { 
    graph <http://b> { ?s ?p ?o } 
    NOT EXISTS { graph <http://a> { ?s ?p ?o } } 
} 

---------------------------------------------- 
| s   | p   | o   | 
============================================== 
| <urn:uuid:b> | <urn:uuid:p> | <urn:uuid:b> | 
---------------------------------------------- 

一般情況下,如果X不包含三元組是不是也於Y,則X是Y的使用查詢,如上述情況,我們可以發現這樣的三元組是一個,而不是在其他的子集。

如果我們不關心特定的三元組,我們可以使用ASK查詢來檢查是否存在,而不必知道它們是什麼。例如,因爲不存在這樣的三元組,所以例如,但是,由於我們試圖詢問A 是否爲B的一個子圖,這是由它們沒有三元組表示的,所以我們需要在這裏反轉真值。所以我們使用:

ask { 
    NOT EXISTS { 
    graph <http://a> { ?s ?p ?o } 
    NOT EXISTS { graph <http://b> { ?s ?p ?o } } 
    } 
} 

yes 

同樣,如果我們問B是否是A的子圖,我們得到no

ask { 
    NOT EXISTS { 
    graph <http://b> { ?s ?p ?o } 
    NOT EXISTS { graph <http://a> { ?s ?p ?o } } 
    } 
} 

no