如何在SPARQL中将变量传递给服务表达式?

如何在SPARQL中将变量传递给服务表达式?,sparql,rdf,fuseki,apache-jena,Sparql,Rdf,Fuseki,Apache Jena,我已经为现场音乐会构建了一个本体,Concert_ontology.ttl。其中包含音乐会、艺术家、曲目和歌曲的定义。我想根据属性c:artistName和dbp:name匹配我的本体中的艺术家和dbpediaperson本体中的艺术家。我编写了以下查询以访问dbpedia端点并检索有关艺术家的其他信息 PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dbo: <http://dbpedia.org/o

我已经为现场音乐会构建了一个本体,Concert_ontology.ttl。其中包含音乐会、艺术家、曲目和歌曲的定义。我想根据属性c:artistName和dbp:name匹配我的本体中的艺术家和dbpediaperson本体中的艺术家。我编写了以下查询以访问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)  
    }  
}  
前缀rdfs:
前缀dbo:
前缀dbp:
前缀rdf:
前缀c:
选择?表演者?艺人姓名?dob
何处{
?表演者a c:艺术家;
c:艺人姓名?艺人姓名。
服务{
?个人dbo:个人;
dbo:出生日期?出生日期;
dbp:name?n。
过滤器(str(?n)=?艺术家姓名)
}  
}  
但是,我似乎无法从服务表达式中访问?artistname变量。如果我将FILTER方法放在服务表达式之外,则查询可以工作,但由于dbpedia的返回上限为10000个结果,因此我无法检索并匹配所有美工人员


有人能指导我找到这个问题的解决方案吗?

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

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

和本地筛选。

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

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

并在本地进行筛选。

我找到了解决问题的方法。筛选器函数将无法与远程终结点上的局部变量一起使用。但是,如果我省略了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 .
    }
}
SELECT?performer?artistname?dob
在哪里{
?表演者a:表演者;
:艺人姓名?艺人姓名。
服务{
?个人dbo:个人;
dbo:出生日期?出生日期;
名字?艺人的名字。
}
}

我找到了解决问题的方法。筛选器函数将无法与远程终结点上的局部变量一起使用。但是,如果我省略了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 .
    }
}
SELECT?performer?artistname?dob
在哪里{
?表演者a:表演者;
:艺人姓名?艺人姓名。
服务{
?个人dbo:个人;
dbo:出生日期?出生日期;
名字?艺人的名字。
}
}

您使用哪种API来运行联邦查询?我使用Apache Jena Fusekiw您使用哪种API来运行联邦查询?我使用Apache Jena FusekiAs我在问题中提到,dbpedia的返回上限为10000个结果。这个特定的查询将返回远远超过10000个结果。所以这并不能解决我的问题,因为我尝试匹配的许多艺术家的索引都大于10000。正如我在问题中所说的,dbpedia的返回上限为10000个结果。这个特定的查询将返回远远超过10000个结果。所以这并不能解决我的问题,因为我试图匹配的许多艺术家的索引都大于10000。