2015-12-05 106 views
1

我模仿專輯中的歌曲如下:如何在4store中重用SPARQL子查詢的結果?

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 

@prefix md: <http://example.com/music-discography#> . 

md:album1 md:songs-of-album md:song1 . 
md:album1 md:songs-of-album md:song2 . 
md:album1 md:songs-of-album md:song3 . 

md:song1 md:name "Song 1" . 
md:song2 md:name "Song 2" . 
md:song3 md:name "Song 3" . 

md:song1 md:position "1"^^xsd:integer . 
md:song2 md:position "2"^^xsd:integer . 
md:song3 md:position "3"^^xsd:integer . 

我希望能夠訪問一張專輯的最後一首歌曲的名字。

所以我想到了第一次通過計算有多少歌曲專輯,讓最後一首歌的md:position包含

SELECT (COUNT(*) AS ?lastposition) 
WHERE { 
    { md:album1 md:songs-of-album ?songInnerQuery } 
} 

產生正確的結果「3」:

<results> 
    <result> 
     <binding name="lastposition"> 
    <literal datatype="http://www.w3.org/2001/XMLSchema#integer">3</literal> 
    </binding> 
    </result> 
    </results> 

後來想通過使用上面的查詢作爲子查詢重用此結果。我怎樣才能做到這一點?我試過如下:

SELECT ?songName WHERE { 

    ?song md:position ?lastposition . 
    ?song md:name ?songName 

    { SELECT (COUNT(*) AS ?lastposition) 
    WHERE { 
     { md:album1 md:songs-of-album ?songInnerQuery } 
    } 
    } 

} 

然而,這並不工作,併產生所有三首歌曲:

<results> 
    <result> 
     <binding name="songName"><literal>Song 3</literal></binding> 
    </result> 
    <result> 
     <binding name="songName"><literal>Song 2</literal></binding> 
    </result> 
    <result> 
     <binding name="songName"><literal>Song 1</literal></binding> 
    </result> 
    </results> 

爲什麼會出現這種情況,什麼是這樣做的正確方法是什麼?我正在使用三重商店4store

回答

1

它看起來像它在4store的錯誤。你可能應該向他們報告。你用Jena得到的結果是你所期望的:

<?xml version="1.0"?> 
<sparql xmlns="http://www.w3.org/2005/sparql-results#"> 
    <head> 
    <variable name="songName"/> 
    </head> 
    <results> 
    <result> 
     <binding name="songName"> 
     <literal>Song 3</literal> 
     </binding> 
    </result> 
    </results> 
</sparql> 

但是,你不需要子查詢來做到這一點。你可以把這首歌的位置放在沒有更大位置的歌曲上:

SELECT ?songName WHERE { 
    ?song md:position ?lastposition . 
    ?song md:name ?songName 

    filter not exists { 
    ?song_ md:position ?position 
    filter (?position > ?lastposition) 
    } 
} 
+0

謝謝你的替代解決方案。只要我有足夠的聲譽,就會立刻起效。不幸的是,4store似乎並不支持這一點:_parser錯誤:語法錯誤,意外的不在第9_行。或者我做錯了什麼。我會盡力與他們取得關於這兩種情況的聯繫。 – nistel

+0

@nistel 2013年,它看起來像「過濾器不存在」尚未支持([Google網上論壇帖子]](https://groups.google.com/forum/#!topic/4store-support/k0ny4w8nZ9w))。解決方法是使用「減號」。不過,我不知道這是否會起作用。 –

+0

謝謝Joshua指出這一點。該查詢將執行,但不會返回對songName的綁定。我在那邊打開了一個線程(尚未批准)。 – nistel