dbpedia和linkedmdb上的联合查询

时间:2017-03-17 01:21:02

标签: sparql ontology dbpedia sparqlwrapper linkedmdb

我正在编写一个联合查询来获取基于dbpedia中的电影的书籍,然后使用来自dbpedia的电影名称来检索相应的imdblink链接。当我添加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

1 个答案:

答案 0 :(得分:0)

由于?filename变量

,这不起作用
    你得到的第一个SERVICE条款中的
  1. ?movie foaf:name ?filmname,因此,这些是字符串文字
  2. 第二个SERVICE子句?filmname中的
  3. 是URI
  4. 很容易看出你是否单独运行两个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) )
      }