2017-03-17 3 views
0

Ich schreibe eine Verbundabfrage, um die Bücher basierend auf Filmen in dbpedia und wiederum den Filmnamen von dbpedia zu erhalten, um den entsprechenden imdblink-Link für die gleiche zu erhalten. Ich bekomme einen leeren Satz, wenn ich den Dienst von linkedmdb hinzufüge.Föderierte Abfragen auf dbpedia und linkedmdb

Hier ist mein 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")) 
} 

} 

ich die folgende Endpunkt mit http://www.sparql.org/query.html

Antwort

0

Das ist nicht wegen der Sie ?movie foaf:name ?filmname bekommen ?filename Variable

  1. in der ersten SERVICE Klausel funktioniert Dies sind also String-Literale
  2. in der zweiten SERVICE Klausel ?filmname sind URIs

Es ist leicht zu machen, um zu sehen, wenn Sie beide SPARQL Abfragen separat ausgeführt werden.

Was würden Sie tun müssen, ist auf den Titel entsprechen, dh

?filmname dc:title ?title .

zu

?filmname dc:title ?filmname .

Hinweis ändern, könnte dies nicht wegen der unterschiedlichen Arten von Strings arbeiten , z.B mit und ohne Sprach-Tag usw. In diesem Fall würden Sie auf die lexikalische Form wieder entsprechen haben, das heißt temporäre Variablen verwenden ?filmname1 und ?filmname2 und verwenden

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