2016-11-12 28 views
0

我已经为现场音乐会建立了本体论,Concert_Ontology.ttl。这包含音乐会,艺术家,曲目和歌曲的定义。我想根据属性c:artistName和dbp:name匹配我的本体中的艺术家和dbpedia Person本体中的艺术家。我已经编写了以下查询来访问dbpedia端点并检索有关艺术家的其他信息。如何将变量传递给SPARQL中的SERVICE表达式?

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个结果的返回上限,因此我无法检索并匹配所有艺术家。

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

+0

您使用哪个API来运行联合查询? – AKSW

+0

我正在使用Apache Jena Fuseki –

回答

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

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

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

并在本地过滤。

+0

正如我在我的问题中所述,dbpedia具有10,000个结果的回报上限。这个特定的查询将返回远远超过10,000个结果。所以这并不能解决我的问题,因为我试图匹配的许多艺术家的索引大于10,000。 –

相关问题