2010-05-04 67 views
1

我有兩個疑問:SPARQL UNION - 結果集不完整

查詢1:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{ ?s1 ?somep1 <predicate_one-uri>. ?s1 ?p ?o} 

查詢2:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.} 

每個查詢都帶給我不同的結果集(如預期) 。我需要讓這兩組的聯合,從我的理解下面的查詢應該給我一套我想:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{ 
{ ?s1 ?somep1 <predicate_one-uri>.?s1 ?p1 ?o} 
    UNION 
{?s2 ?somep2 <predicate_two-uri>.?s2 ?p2 ?o.} 
} 

的問題是,從查詢1一些成果沒有在工會組和副-versa查詢2.聯合工作不正常,因爲它沒有包含查詢1和查詢2的所有結果。請告知正確的sparql查詢結構以實現所需的結果集。

但如果我提出以下查詢(只是刪除COUNT函數):

SELECT DISTINCT ?o 
WHERE 
{ 
{ ?s1 ?somep1 <predicate_one-uri>.?s1 ?p ?o} 
UNION {?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.} 
} 

我得到相應的結果集。但我也需要有變量?o的頻率。

回答

1

不完全在這裏肯定,但有一個理論,這可能是完全錯誤的

您所查詢的混淆我咯,因爲它似乎在暗示一些分組,因爲在理論上至少一個SPARQL引擎應該不會讓你同時選擇一個變量,沒有顯式GROUP BY的同一查詢中該變量的聚合。所以結果可能取決於您使用的SPARQL引擎/三重存儲?

如果隱式分組是這種情況,您可能得不到像您期望的那麼多的結果,因爲分組會將來自聯合兩端的結果組合在一起。例如,假設查詢1爲您提供了10個結果,查詢2爲您提供了5個結果,那麼您可以從一個聯合中獲得的結果的最大數量是15,但可能會少一些,因爲該分組可能會將聯合兩邊的結果組合在一起。爲了避免這種情況,那麼你應該對查詢的兩側使用完全不同的變量名,例如:

SELECT * WHERE { {?s ?p ?o} UNION {?x ?y ?z}} 

這會給你一個結果表,有一個像下面這樣的模式:

?s | ?p | ?o | ?x | ?y | ?z 
----------------------------- 
    a | b | c | | | 
    | | | a | b | c 

不知道是否有任何與您相關/有用的,如果您可以提供關於您正在執行查詢的環境的更多細節,例如Triplestore,SPARQL引擎,API /庫等,那麼我/其他人可能能夠提供更好的回答

+0

感謝您的反饋。我使用OpenVirtuoso,我相信它使用Jena,允許我使用COUNT聚合函數。我在這裏得到了一個參考:http://stackoverflow.com/questions/1223472/sparql-query-and-distinct-count。 據我所知,聯合返回的行數可能小於兩個查詢的總和,因爲聯合。我的問題是,有些值甚至不會顯示在查詢1中存在的聯合查詢中。 對不起,我還是SPARQL和RDF的新手,我相信三重商店是RDF/XML(這是否有意義?)。 再次感謝, JPL – levacjeep 2010-05-05 14:59:41

2

我認爲它會工作如果您刪除DISTINCT,並將GROUP BY ?o添加到查詢的末尾。

DISTINCT真的只是爲了刪除重複。這不是分組和計數。