dbpedia 和 linkedmdb 上的联合查询

Federated queries on dbpedia and linkedmdb

我正在编写联合查询以获取基于 dbpedia 中电影的书籍,然后使用 dbpedia 中的电影名称检索相应的 imdblink link。当我添加 linkedmdb.

的服务时,我得到一个空集

这是我的代码

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbp: <http://dbpedia.org/property/>

 SELECT distinct ?name ?author ?filmname ?imdbID WHERE {
 SERVICE <http://dbpedia.org/sparql> {
    ?book rdf:type dbo:Book .
   ?book foaf:name ?name .
   ?book dbp:author ?author .
   ?author foaf:name ?authname .
  ?book ^dbo:basedOn ?movie . 
   ?movie a dbo:Film .
   ?movie foaf:name ?filmname
   FILTER (str(?name) IN ("Royal Flash","White Oleander", "Possession: A Romance", "Misery", "Intensity", "The War of The Roses", "Momo", "The Sicilian", "Derailed", "Ragtime"))

}
SERVICE <http://data.linkedmdb.org/sparql> {
    ?filmname foaf:page ?imdbID .  
    ?filmname dc:title ?title .
 FILTER(regex(str(?imdbID), "www.imdb.com" ) )
}

}

我正在使用以下端点http://www.sparql.org/query.html

由于 ?filename 变量

,这不起作用
  1. 在第一个 SERVICE 子句中你得到 ?movie foaf:name ?filmname,因此,这些是字符串文字
  2. 在第二个 SERVICE 子句中 ?filmname 是 URI

如果您 运行 两个 SPARQL 分别查询,将变得很容易看到。

您需要做的是匹配标题,即更改

?filmname dc:title ?title .

?filmname dc:title ?filmname .

请注意,由于字符串类型不同,这可能不起作用,例如有和没有语言标签等。 在那种情况下,您将不得不再次匹配词法形式,即使用临时变量 ?filmname1?filmname2 并使用

FILTER(str(?filmname1) = str(?filmname2))

PREFIX  dbo:  <http://dbpedia.org/ontology/>
PREFIX  dbp:  <http://dbpedia.org/property/>
PREFIX  movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX  owl:  <http://www.w3.org/2002/07/owl#>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX  foaf: <http://xmlns.com/foaf/0.1/>
PREFIX  dc:   <http://purl.org/dc/terms/>

SELECT DISTINCT  ?name ?author ?filmname1 ?imdbID
WHERE
  { SERVICE <http://dbpedia.org/sparql>
      { ?book    rdf:type    dbo:Book ;
                 foaf:name   ?name ;
                 dbp:author  ?author .
        ?author  foaf:name   ?authname .
        ?book   ^dbo:basedOn ?movie .
        ?movie  rdf:type   dbo:Film ;
                foaf:name  ?filmname1
        FILTER ( str(?name) IN ("Royal Flash", "White Oleander", "Possession: A Romance", "Misery", "Intensity", "The War of The Roses", "Momo", "The Sicilian", "Derailed", "Ragtime") )
      }
    SERVICE <http://data.linkedmdb.org/sparql>
      { ?filmname  foaf:page  ?imdbID ;
                  dc:title   ?filmname2
        FILTER regex(str(?imdbID), "www.imdb.com")
      }
    FILTER ( str(?filmname1) = str(?filmname2) )
  }