如何将变量传递给 SPARQL 中的 SERVICE 表达式?

How to pass a variable to a SERVICE expression in SPARQL?

我已经为现场音乐会构建了一个 ontology,Concert_Ontology.ttl。这包含音乐会、艺术家、曲目和歌曲的定义。我想根据属性 c:artistName 和 dbp:name 匹配我 ontology 中的艺术家和 dbpedia Person ontology 中的艺术家。我编写了以下查询来访问 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 的 return 上限为 10000 个结果,我无法检索和匹配所有艺术家。

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

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

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

并在本地过滤。

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

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 .
    }
}

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

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

无需按名称过滤。