如何进行SPARQL可选

bal*_*lla 1 sparql

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

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
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 5

将 OPTIONAL 模式拆分为多个部分

\n\n

图案

\n\n
<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth ;\n                                            dbpprop:birthPlace ?birthPlace ;\n                                            dbo:birthDate ?birthDate ;\n                                            dbo:thumbnail ?thumbnail .\n
Run Code Online (Sandbox Code Playgroud)\n\n

是四个三重模式的简写:

\n\n
<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth .\n<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:birthPlace ?birthPlace .\n<http://dbpedia.org/resource/Ismail_Kadare> dbo:birthDate ?birthDate .\n<http://dbpedia.org/resource/Ismail_Kadare> dbo:thumbnail ?thumbnail .\n
Run Code Online (Sandbox Code Playgroud)\n\n

OPTIONAL { \xe2\x80\xa6first pattern\xe2\x80\xa6 }您只需使用四个可选块,而不是,每个块对应四个三重模式中的每一个:

\n\n
optional { <http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth }\noptional { <http://dbpedia.org/resource/Ismail_Kadare> dbpprop:birthPlace ?birthPlace }\noptional { <http://dbpedia.org/resource/Ismail_Kadare> dbo:birthDate ?birthDate }\noptional { <http://dbpedia.org/resource/Ismail_Kadare> dbo:thumbnail ?thumbnail }\n
Run Code Online (Sandbox Code Playgroud)\n\n

其他事宜

\n\n

值得一提的是,语言匹配比字符串匹配稍微复杂一点,所以而不是

\n\n
FILTER (LANG(?label) = \'en\')    \nFILTER (LANG(?abstract) = \'en\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

你真的应该使用

\n\n
filter(langMatches(lang(?label),\'en\'))\nfilter(langMatches(lang(?abstract),\'en\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

它允许您检索使用不同语言标签(全是英语)的结果。

\n\n

select distinct两者limit 1都不是必需的

\n\n

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

\n\n

标准命名空间

\n\n

看起来您正在针对 DBpedia 进行查询,因此可能值得使用公共端点定义的相同命名空间前缀,以便您可以更轻松地复制和粘贴查询并进行实验。这样做(并使用 avalues ?x { dbpedia:Ismail_Kadare }来避免一些输入,我们最终得到这个查询:

\n\n
select ?label ?abstract ?placeOfBirth ?birthPlace ?birthDate ?page ?thumbnail \nwhere { \n    values ?x { dbpedia:Ismail_Kadare }\n    ?x rdfs:label ?label ;\n       dbpedia-owl:abstract ?abstract ;\n       foaf:page ?page .\n    optional { ?x dbpprop:placeOfBirth  ?placeOfBirth }\n    optional { ?x dbpprop:birthPlace    ?birthPlace }\n    optional { ?x dbpedia-owl:birthDate ?birthDate }\n    optional { ?x dbpedia-owl:thumbnail ?thumbnail }\n    filter langMatches(lang(?label),\'en\')\n    filter langMatches(lang(?abstract),\'en\')\n}\nlimit 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n