如何将变量传递给 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)
无需按名称过滤。
我已经为现场音乐会构建了一个 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)
无需按名称过滤。