2013-03-10 15 views
9

一個典型的SPARQL查詢指定的圖形可能是這樣的:針對兩個圖表運行sparql查詢?

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c}} 

這將告訴我AliceIRI所有的三元組,其中「富」是一個主題。如果我想在兩個不同的圖表看,是我做的一個UNION唯一的選擇:

SELECT ?b ?c WHERE {{ GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c}} 
UNION 
{ GRAPH <http://BobIRI> { 
<http://local.virt/foo> ?b ?c}}} 

或者是有一些速記,讓我更方便地寫這篇文章,是這樣的:

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> { 
<http://local.virt/foo> ?b ?c} 

順便說一句我在Virtuoso 6.01.3127。

更新1

爲了澄清,我真的很想能夠運行:

SELECT ?b ?c WHERE { GRAPH <http://AliceIRI> + <http://BobIRI> { 
<http://local.virt/foo> ?b ?c . 
<http://local.virt/bar> ?b ?c}} 

,並有這場比賽?b?c這樣<http://local.virt/foo> ?b ?c<http://AliceIRI><http://local.virt/bar> ?b ?c<http://BobIRI>。僅僅考慮<http://AliceIRI>(單獨)和<http://BobIRI>(單獨)中的匹配的聯合將不能實現這一點。

爲了進一步澄清:我已經意識到,如果FOOS都屬於愛麗絲和所有屬於鮑勃吧,然後我可以寫

SELECT ?b ?c WHERE { 
GRAPH <http://AliceIRI> { 
<http://local.virt/foo> ?b ?c } . 
GRAPH <http://BobIRI> { 
<http://local.virt/bar> ?b ?c}} 

(實際上是我需要什麼我的應用程序) - 但至少對於「學術興趣」來說,是否存在一種語法上好的方式來針對圖的聯合運行查詢(而不是針對多個圖,然後聯合結果)的問題仍然存在。

回答

7

SELECT ?b ?c 
FROM NAMED <http://AliceIRI> 
FROM NAMED <http://BobIri> 
WHERE 
{ 
    GRAPH ?g { <http://local.virt/foo> ?b ?c } 
} 

FROM NAMED條款可能被用來當您使用GRAPH ?var條款設置被查詢的命名圖。

需要注意的是語義這個查詢等同於你的上方,由GRAPH條款所表達的模式是針對每個命名圖分別匹配撰寫並聯合在一起

編輯

要重要在您的評論中回答額外問題是的,如果您使用FROM而不是FROM NAMED,則會將此查詢的默認圖形設置爲FROM子句中所有圖形的合併,並且不要求您使用GRAPH例如

SELECT ?b ?c 
FROM <http://AliceIRI> 
FROM <http://BobIri> 
WHERE 
{ 
    <http://local.virt/foo> ?b ?c 
} 

這涵蓋了您希望允許三元組匹配三元模式的不同部分來自您已命名的任何圖表的情況。

請注意,某些三重商店可能允許您設置它們,以便將默認圖形自動視爲所有指定圖形的合併。

+1

如果這只是工會橫跨圖的結果,而不是允許從各種圖形繪製三元三重模式,那麼這是一個有點遲鈍的手段。您能否澄清這是否是唯一可用的工具(請參閱上面的更新1)。 – 2013-03-11 19:20:31

+1

@JoeCorneli我已經更新了我的答案,是的,你可以做一個稍微不同的查詢 – RobV 2013-03-11 21:16:37

+0

精彩,謝謝你的增加。 – 2013-03-12 13:52:35

1

如果您必須在正在使用的圖的子集中運行查詢,則還可以在圖的iri上設置過濾器。

如:

SELECT ?b ?c 
FROM NAMED <http://AliceIRI> 
FROM NAMED <http://BobIri> 
FROM NAMED <http://CarlIri> 
WHERE { 
GRAPH ?g { 
    <http://local.virt/foo> ?b ?c 
    FILTER(?g=<http://AliceIRI> || ?g=<http://BobIri>) 
} 
}