首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在4 4store中重用SPARQL子查询的结果?

如何在4 4store中重用SPARQL子查询的结果?
EN

Stack Overflow用户
提问于 2015-12-05 14:11:01
回答 1查看 149关注 0票数 1

我模仿了一张专辑的歌曲如下:

代码语言:javascript
复制
@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

代码语言:javascript
复制
SELECT (COUNT(*) AS ?lastposition)
WHERE {
  { md:album1 md:songs-of-album ?songInnerQuery }
}

它产生正确的结果"3":

代码语言:javascript
复制
  <results>
    <result>
      <binding name="lastposition">
    <literal datatype="http://www.w3.org/2001/XMLSchema#integer">3</literal>
    </binding>
    </result>
  </results>

然后,我希望通过使用上面的查询作为子查询来重用这个结果。我该怎么做?我尝试了以下几点:

代码语言:javascript
复制
SELECT ?songName WHERE {

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

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

}

然而,这是行不通的,产生了三首歌:

代码语言:javascript
复制
  <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>

为什么会发生这种情况,正确的做法是什么?我正在使用triplestore 4商店

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-05 17:17:33

看上去好像是4店里的一个窃听器。你应该向他们报告。你在耶拿身上得到的结果是你所期望的:

代码语言:javascript
复制
<?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>

但是,您不需要一个子查询就可以做到这一点。您可以选择这样的歌曲,即没有任何歌曲具有更大的位置:

代码语言:javascript
复制
SELECT ?songName WHERE {
  ?song md:position ?lastposition .
  ?song md:name ?songName

  filter not exists {
    ?song_ md:position ?position
    filter (?position > ?lastposition)
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34106448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档