2011-05-13 44 views
1

如果我有一個SPARQL查詢說,SPARQL中應用了多少次屬性?

PREFIX foaf <http://xmlns.com/foaf/0.1/> 
SELECT ?name 
WHERE { 
    ?x foaf:name ?name. 
    ?x foaf:knows ?y. 
} 

選擇一些X,誰知道一些y的名字。我怎麼能只選擇那些確切知道另外3個人(或任何其他人)的人的名字?

此外,作爲一個側面問題 - 這個問題是否有更好的標題?一個用更好的術語來澄清問題?

感謝

+1

是的,標題可能有點混亂。但是如果你不知道聚集的存在,那麼我認爲這並不壞。最後,在這種情況下,重要的是問題的內容。 – 2011-05-14 08:30:18

+0

@msalvadores謝謝。我不知道這個術語是否適用於SPARQL以及SQL,因此沒有。 – Adam 2011-05-14 10:10:14

回答

3

你可以實現與SPARQL 1.1,它的新功能:GROUP BY,HAVING和子查詢。像這樣的東西可以完成這項工作:

SELECT ?name 
WHERE { 
    ?x foaf:name ?name . 
    { 
     SELECT ?x (count(?y) as ?count_y) WHERE { 
       ?x foaf:knows ?y. 
     } GROUP BY ?x 
     HAVING count(?y) > 3 
    } 
} 

不幸的是,並非所有的SPARQL引擎都支持所有這些功能。我知道Jena/ARQVirtuoso支持他們。

如果您使用的是不支持這些功能,那麼我建議運行查詢的SPARQL發動機的工作:

SELECT ?name 
WHERE { 
    ?x foaf:name ?name. 
    ?x foaf:knows ?y. 
} 

...和編程計算邏輯,你在需要休息用幾行客戶端代碼查詢。

+0

因此,擁有SPARQL 1.1。這是否取決於端點,或我的Jena/ARQ庫,或兩者? – Adam 2011-05-14 09:30:36

+0

此外,大概這將是==,而不是> – Adam 2011-05-14 09:36:57

+1

@Aidan是的正好3個朋友將其更改爲'='(注意單等於SPARQL中的相等)。 SPARQL 1.1支持取決於端點,您是否需要支持它的庫取決於該庫是否在將查詢發送到端點之前解析/驗證該查詢。如果庫不這樣做,那麼只需要端點支持SPARQL 1.1,因爲用於端點對結果進行編碼的結果格式看起來完全相同,並且可以由不知道SPARQL 1.1的庫進行解釋 – RobV 2011-05-14 12:02:05