【问题标题】:For Loop in SPARQLSPARQL 中的 For 循环
【发布时间】:2016-01-23 14:16:36
【问题描述】:

我有一个简单的问题。当我在 DBpedia SPARQL 端点上运行这个查询时,我得到一个包含 5 个电影 URI 的列表:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

select ?film {
?film rdf:type <http://schema.org/Movie>.

}
limit 5

我正在尝试访问列表中每部电影的所有谓词和对象。我试过了,但没有用。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

select ?film ?p ?o {
?film rdf:type <http://schema.org/Movie>;
      ?p ?o.
}
group by ?film
limit 5

有什么建议吗?

【问题讨论】:

    标签: rdf sparql semantics semantic-web dbpedia


    【解决方案1】:

    SPARQL 本质上是递归的,因此不需要 for 循环。这意味着,关于您的第二个示例,它将匹配所有谓词和对象,其中电影是一种电影。我相信您可能会认为您的查询实际上不起作用,但返回的答案数量的限制掩盖了这一点。

    我建议检索一部电影 -

    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
    select ?s ?o ?o where {
     ?s ?p ?o .
     FILTER (?s = ?film)
     {
      select ?film {
       ?film rdf:type <http://schema.org/Movie> .
      }
      group by ?film
      limit 1
     }
    }
    

    【讨论】:

    • 一些注意事项:(i) 我很确定您想要“select ?s ?p ?o”,而不是“select ?s ?o ?o”。 (ii) 您可以通过使用相同的变量来消除过滤器(如果查询引擎是幼稚的,这可能是低效的)。即,使子查询为“{ select ?s { ?s rdf:type ...”。 (iii) 子查询中不需要“分组依据”。 (iv) 限制应该是 5,而不是 1(但是 OP 需要将其设置为 OP 需要的任何值,所以这并不重要)。
    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2021-07-30
    • 1970-01-01
    • 2022-10-20
    相关资源
    最近更新 更多