2017-03-17 72 views
0

我正在編寫一個聯邦查詢來獲取基於dbpedia中影片的書籍,然後使用dbpedia中的影片名稱檢索相同的imdblink鏈接。當我添加linkedmdb的服務時,我得到一個空集。dbpedia和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

回答

0

這並不是因爲?filename可變

    第一 SERVICE子句中
  1. 工作,你得到 ?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)) 
    }