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

时间:2016-11-12 17:24:26

标签: sparql rdf fuseki apache-jena

我为现场音乐会构建了一个本体,Concert_Ontology.ttl。其中包含音乐会,艺术家,曲目和歌曲的定义。我想基于属性c:artistName和dbp:name来匹配我的本体中的艺术家和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的返回上限为10000,我无法检索并匹配所有艺术家。

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

2 个答案:

答案 0 :(得分:1)

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

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

并在本地过滤。

答案 1 :(得分:1)

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

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