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。
謝謝你的替代解決方案。只要我有足夠的聲譽,就會立刻起效。不幸的是,4store似乎並不支持這一點:_parser錯誤:語法錯誤,意外的不在第9_行。或者我做錯了什麼。我會盡力與他們取得關於這兩種情況的聯繫。 – nistel
@nistel 2013年,它看起來像「過濾器不存在」尚未支持([Google網上論壇帖子]](https://groups.google.com/forum/#!topic/4store-support/k0ny4w8nZ9w))。解決方法是使用「減號」。不過,我不知道這是否會起作用。 –
謝謝Joshua指出這一點。該查詢將執行,但不會返回對songName的綁定。我在那邊打開了一個線程(尚未批准)。 – nistel