2015-11-23 44 views
2

我是語義網和SPARQL的新手。我正在製作音樂會的RDFS。它有歌曲條目,如:如何使用SPARQL查詢同時獲取字段和字段數?

con:song04 
    rdfs:Class con:Repertoire; 
    rdfs:label "Deewani Mastani"; 
    con:performedBy con:artist02. 
    con:performedBy con:artist05. 

我想獲得的歌曲和他們的計數列表中,如果它們是由同一位藝術家進行。我一直在嘗試從一些教程從計算器,但不服務我的目的。

我正在使用的查詢可能是完全錯誤的,如果有人能夠幫助我解決這方面的問題,這對學習會非常有幫助。我正在使用Apache Jena Fuseki進行查詢。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX co: <http://rhizomik.net/ontologies/copyrightonto.owl#> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
prefix con: <http://www.example.com/paras/concert#> 

#Use SPARQL to count and list the songs that two artists share. 
SELECT ?songs (COUNT(?artist) AS ?count) 
WHERE 
{ 
    ?s rdfs:label ?songs . 
    ?s rdf:type con:Repertoire. 
    ?s con:performedBy ?artist. 
    ?artist rdf:type con:Artist . 
    filter(?count > 1) 
} 
+1

這不是您的問題的答案,但重要的是:您正在使用資源'rdfs:Class'錯誤。這是一個類名,而不是一個屬性。三重'con:song04 rdfs:Class con:Repertoire'確實不會說第4首歌曲在「Repertoire」類中。如果這就是你想要表達的,你應該使用'rdf:type'來代替(這是表示實例級關係的屬性)。 –

+1

@JeenBroekstra:你的意思是說,我應該說'con:song04 ref:type con:Repertoire'而不是?請澄清,謝謝 –

+1

是的,減去錯字(它是'rdf',而不是'ref')。 –

回答

2
SELECT ?songs (COUNT(?artist) AS ?count) 
WHERE 
{ 
    ?s rdfs:label ?songs . 
    ?s rdfs:Class con:Repertoire. 
    ?s con:performedBy ?artist. 
    ?artist rdfs:Class con:Artist . 
    filter(?count > 1) 
} 

如果您粘貼查詢到validator at sparql.org,你看,這是一個錯誤選擇,你有沒有分組,當你使用像COUNT聚合函數由變量。您的查詢是差不多正確。你正在嘗試GROUP BY這首歌曲,還有COUNT有多少歌手做了那首歌。然後,你要只需要結果具有計數大於1.你是這樣做的:

SELECT ?songs (COUNT(?artist) AS ?count) 
WHERE 
{ 
    ?s rdfs:label ?songs . 
    ?s rdfs:Class con:Repertoire. 
    ?s con:performedBy ?artist. 
    ?artist rdfs:Class con:Artist . 
} 
GROUP BY ?songs 
HAVING (?count > 1) 
+0

嗨@Joshua,謝謝,你的解釋幫助我更好地理解。你完全理解我想要做什麼,但我沒有得到正確的答案。 (可能是我想念的東西,幫助,將不勝感激。 –

+2

@ParashNathMishra無需知道你期待的結果,它將很難幫助你解決查詢。 –

+0

我想列出所執行的歌曲超過2位藝術家,正如問題中提到的,我希望將song04列爲結果,因爲它也被2位藝術家加香,顯示滿足條件的歌曲的數量。 –

1

根據給出的說明,我完全@Joshua泰勒同意並相信你正在嘗試做的可通過查詢來實現。請檢查您的RDFS是否正常。

SELECT ?songs (COUNT(?artist) AS ?count) 
WHERE 
{ 
    ?s rdfs:label ?songs . 
    ?s rdfs:Class con:Repertoire. 
    ?s con:performedBy ?artist. 
    ?artist rdfs:Class con:Artist . 
} 
GROUP BY ?songs 
HAVING (?count > 1) 
+1

謝謝Suresh,這對我的RDFS確實有問題。 –