sparqlontologydbpediasparqlwrapperlinkedmdb

Federated queries on dbpedia and linkedmdb


I am writing a federated query to get the books based on films in dbpedia and in turn using the film name from dbpedia to retrieve the corresponding imdblink link for the same. I am getting an empty set when I add the service of linkedmdb.

Here is my code

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" ) )
}

}

I am using the following endpoint http://www.sparql.org/query.html


Solution

  • That does not work because of the ?filename variable

    1. in the first SERVICE clause you get ?movie foaf:name ?filmname, thus, those are string literals
    2. in the second SERVICE clause ?filmname are URIs

    It will become easy to see if you run both SPARQL queries separately.

    What you would have to do is to match on the title, i.e. change

    ?filmname dc:title ?title .

    to

    ?filmname dc:title ?filmname .

    Note, this might not work because of different types of strings, e.g. with and without language tag etc. In that case you would have to match on the lexical form again, i.e. use temporary variables ?filmname1 and ?filmname2 and use

    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) )
      }