【问题标题】:How to pass a variable to a SERVICE expression in SPARQL?如何将变量传递给 SPARQL 中的 SERVICE 表达式?
【发布时间】:2016-11-12 17:24:25
【问题描述】:

我已经为现场音乐会构建了一个本体,Concert_Ontology.ttl。这包含音乐会、艺术家、曲目和歌曲的定义。我想根据属性 c:artistName 和 dbp:name 匹配我的本体中的艺术家和 dbpedia Person 本体中的艺术家。我编写了以下查询来访问 dbpedia 端点并检索有关艺术家的其他信息。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>  
PREFIX dbo: <http://dbpedia.org/ontology/>  
PREFIX dbp: <http://dbpedia.org/property/>  
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>  
PREFIX c: <http://localhost:8080/Concert_Ontology.ttl#>  

SELECT ?performer ?artistname ?dob  
WHERE {  
    ?performer a c:Artist ;  
               c:artistName ?artistname .  
    SERVICE <http://dbpedia.org/sparql> {  
        ?person a dbo:Person ;  
              dbo:birthDate ?dob ;  
              dbp:name ?n .  
        FILTER (str(?n) = ?artistname)  
    }  
}  

但是,我似乎无法从 SERVICE 表达式中访问 ?artistname 变量。如果我将 FILTER 方法放在 SERVICE 表达式之外,则查询有效,但由于 dbpedia 的返回上限为 10000 个结果,我无法检索和匹配所有艺术家。

有人可以指导我找到解决此问题的方法吗?

【问题讨论】:

  • 您使用哪个 API 来运行联合查询?
  • 我正在使用 Apache Jena Fuseki

标签: sparql rdf fuseki apache-jena


【解决方案1】:

我找到了解决问题的方法。过滤器函数不适用于远程端点上的局部变量。但是,如果我省略过滤器函数并简单地为本地和远程变量使用相同的变量名,它将返回正确的结果。像这样:

SELECT ?performer ?artistname ?dob
WHERE {
    ?performer a :Performer ;
               :artistName ?artistname .
    SERVICE <http://dbpedia.org/sparql> {
        ?person a dbo:Person ;
                dbo:birthDate ?dob ;
                dbp:name ?artistname .
    }
}

【讨论】:

    【解决方案2】:

    SERVICE 在服务器上执行模式。服务器不知道?artistname 的值(其中可能有很多,并且是调用者的本地信息)。所以最好的办法就是执行

    ?person a dbo:Person ;  
         dbo:birthDate ?dob ;  
         dbp:name ?n . 
    

    并在本地过滤。

    【讨论】:

    • 正如我在问题中所说,dbpedia 的返回上限为 10,000 个结果。此特定查询将返回超过 10,000 个结果。所以这并不能解决我的问题,因为我尝试匹配的许多艺术家的索引都大于 10,000。
    【解决方案3】:

    您可以将变量作为 IRI 传递给 SERVICE。

    bind(iri(concat("http://dbpedia.org/resource/",replace(? artistname," ","_"))) as ?person)
    

    并且无需按名称过滤。

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2014-11-11
      • 2020-06-09
      • 2012-05-27
      • 2012-01-24
      相关资源
      最近更新 更多