如何SPARQL可选

时间:2014-01-04 16:11:54

标签: sparql

我必须使用此Sparql查询来检索有关某人的信息,我的问题是将可选构造分解为多个可选构造。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?label ?abstract ?placeOfBirth 
    ?birthPlace ?birthDate ?page ?thumbnail 
WHERE { 
    <http://dbpedia.org/resource/Ismail_Kadare> rdfs:label ?label ;
        dbo:abstract ?abstract ;
        foaf:page ?page .
    OPTIONAL {
        <http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth ;
            dbpprop:birthPlace ?birthPlace ;
            dbo:birthDate ?birthDate ;
            dbo:thumbnail ?thumbnail .
    }
    FILTER (LANG(?label) = 'en')    
    FILTER (LANG(?abstract) = 'en')
}
LIMIT 1

1 个答案:

答案 0 :(得分:3)

将可选模式拆分为

模式

<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth ;
                                            dbpprop:birthPlace ?birthPlace ;
                                            dbo:birthDate ?birthDate ;
                                            dbo:thumbnail ?thumbnail .

是四种三重模式的简写:

<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth .
<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:birthPlace ?birthPlace .
<http://dbpedia.org/resource/Ismail_Kadare> dbo:birthDate ?birthDate .
<http://dbpedia.org/resource/Ismail_Kadare> dbo:thumbnail ?thumbnail .

而不是OPTIONAL { …first pattern… },您只需使用四个可选块,四个三重模式中的每一个都有一个:

optional { <http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth }
optional { <http://dbpedia.org/resource/Ismail_Kadare> dbpprop:birthPlace ?birthPlace }
optional { <http://dbpedia.org/resource/Ismail_Kadare> dbo:birthDate ?birthDate }
optional { <http://dbpedia.org/resource/Ismail_Kadare> dbo:thumbnail ?thumbnail }

其他问题

语言匹配比字符串匹配要复杂得多,而不是

FILTER (LANG(?label) = 'en')    
FILTER (LANG(?abstract) = 'en')

你应该真正使用

filter(langMatches(lang(?label),'en'))
filter(langMatches(lang(?abstract),'en'))

允许您检索使用全部为英语的不同语言标记的结果。

select distinctlimit 1不是必需的

请注意,select distinct可确保您的结果中没有任何重复的行。但是,limit 1意味着您最多只能获得一个结果,因此不会删除任何重复项。

标准命名空间

看起来您正在查询DBpedia,因此使用public endpoint定义的相同名称空间前缀可能是值得的,这样您就可以更轻松地复制和粘贴查询并进行实验。这样做(并使用values ?x { dbpedia:Ismail_Kadare }来避免某些输入,我们最终得到此查询:

select ?label ?abstract ?placeOfBirth ?birthPlace ?birthDate ?page ?thumbnail 
where { 
    values ?x { dbpedia:Ismail_Kadare }
    ?x rdfs:label ?label ;
       dbpedia-owl:abstract ?abstract ;
       foaf:page ?page .
    optional { ?x dbpprop:placeOfBirth  ?placeOfBirth }
    optional { ?x dbpprop:birthPlace    ?birthPlace }
    optional { ?x dbpedia-owl:birthDate ?birthDate }
    optional { ?x dbpedia-owl:thumbnail ?thumbnail }
    filter langMatches(lang(?label),'en')
    filter langMatches(lang(?abstract),'en')
}
limit 1

DBpedia端点不会返回该查询的任何内容,但这是因为http://dbpedia.org/resource/Ismail_Kadare没有foaf:page属性,而不是因为查询格式错误。我不知道你是否真的对DBpedia运行这个,所以这可能或不重要。