如何使用SPARQL可选

如何使用SPARQL可选,sparql,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/

我必须使用这个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
前缀rdfs:
前缀dbo:
前缀dbpprop:
前缀foaf:
选择不同的?标签?摘要?出生地点
?出生地?出生日期?页面?缩略图
何处{
rdfs:标签?标签;
dbo:抽象?抽象;
第页?第页。
可选的{
dbpprop:出生地点?出生地点;
dbpprop:出生地?出生地;
dbo:生日?生日;
缩图?缩图。
}
过滤器(LANG(?label)=“en”)
过滤器(LANG(?abstract)='en')
}
限制1
将可选图案拆分为多个部分 模式

<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')
你真的应该使用

filter(langMatches(lang(?label),'en'))
filter(langMatches(lang(?abstract),'en'))
它允许您检索使用全英语的不同语言标记的结果

选择distinct
限制1
并非都是必需的 请注意,
selectdistinct
确保结果中没有任何重复的行。但是,
limit 1
意味着您最多只能有一个结果,因此不会有任何重复项需要删除

标准名称空间 看起来您是在对DBpedia进行查询,因此使用与定义相同的名称空间前缀可能是值得的,这样您就可以更轻松地复制和粘贴查询并进行实验。这样做(并使用
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端点不会为该查询返回任何内容,但这是因为没有
foaf:page
属性,而不是因为该查询的格式不正确。我不知道您是否实际对DBpedia运行此操作,所以这可能无关紧要。

将可选模式拆分为多个部分 模式

<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')
你真的应该使用

filter(langMatches(lang(?label),'en'))
filter(langMatches(lang(?abstract),'en'))
它允许您检索使用全英语的不同语言标记的结果

选择distinct
限制1
并非都是必需的 请注意,
select distinct
可确保结果中没有任何重复行。但是,
limit 1
意味着您最多只能有一个结果,因此不会有任何重复项要删除

标准名称空间 看起来您是在查询DBpedia,因此可能值得使用定义的相同名称空间前缀,以便您可以更轻松地复制和粘贴查询并进行实验。这样做(并使用
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端点不会为该查询返回任何内容,但这是因为没有
foaf:page
属性,而不是因为该查询的格式不正确。我不知道您是否实际针对DBpedia运行此操作,所以这可能无关紧要。

您能否建议另一个人,DBpedia端点将为其返回result plz。@balikatravella通过修改上述查询,您可以很容易地找到答案:将
foaf:page
属性也设置为可选,并查看结果中哪些人对其有定义的值。@balikatravella这里有很多关于标签中StackOverflow的问题,可能会对您有所帮助。我真的无法回答帮助您修改此查询,因为此查询正在尝试检索
foaf:page
属性的值,但没有。您没有给出任何其他关于您尝试检索的数据的描述,因此我们无法很好地修复此查询,因为您没有告诉我们它应该执行的操作。(如果我们不知道它有什么问题,我们就无法修复。)您是否可以建议另一个人,DBpedia endpoint将为其返回结果plz。@balikatravella您可以通过修改上述查询很容易找到答案:将
foaf:page
属性也设置为可选,并查看结果中哪些人对其有定义的值。@balikatravella有很多查询需要查询标签中的StackOverflow上的离子可能会对您有所帮助。我无法真正帮助您修改此查询,因为此查询正在尝试检索
foaf:page
属性的值,但没有。您没有给出任何其他关于您尝试检索的数据的描述,因此我们无法很好地修复自y以来的查询你还没有告诉我们它应该做什么。(如果我们不知道它坏了什么,我们就无法修复。)