[英]How can I get the list of movies by a director from dbpedia using sparql query
[英]How can I build a better SPARQL query, to get only the data I want from DBpedia? (was: “How to get rid of multiple rows with DBPEDIA SPARQL”)
我从DBpedia的SPARQL Explorer运行。 我希望只让每位总统一次,但是由于其中一些总统有多个出生地条目,因此会产生多行。
SELECT DISTINCT ?person ?birthPlace ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
?person dbo:birthPlace ?birthPlace .
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
FILTER ( regex(?birthPlace, "_") OR
regex(?birthPlace, ";_")
) .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
我只想知道他们出生的州。
:Abraham_Lincoln [http] :Hodgenville,_Kentucky [http] - -
:Barack_Obama [http] :Kapiolani_Medical_Center_for_Women_and_Children [http] - -
:Bill_Clinton [http] :Hope,_Arkansas [http] - -
:Dwight_D._Eisenhower [http] :Denison,_Texas [http] - -
:George_W._Bush [http] :New_Haven,_Connecticut [http] - -
:George_Washington [http] :Westmoreland_County,_Virginia [http] - -
:George_Washington [http] :British_America [http] - -
:George_Washington [http] :George_Washington_Birthplace_National_Monument [http] - -
:James_A._Garfield [http] :Orange,_Ohio [http] - -
:James_A._Garfield [http] :Moreland_Hills,_Ohio [http] - -
:Jimmy_Carter [http] :Plains,_Georgia
由于SPARQL是一种模式匹配语言,因此当您的查询结果为“太宽泛/笼统”时,诀窍就是创建更具体的模式 。 在这种情况下,你的目的不只是要回被标记为所有资源dbo:birthPlace
值代表美国各州,但只有那些资源。
因此,我们需要弄清楚如何将美国各州与DBPedia中的其他地区区分开。
让我们以肯塔基州为例。 代表肯塔基州的资源是http://dbpedia.org/resource/Kentucky 。 如果向下滚动以概述该资源的属性的页面, yago:WikicatStatesOfTheUnitedStates
发现rdf:type
关系的多个条目,但是最适合我的是yago:WikicatStatesOfTheUnitedStates
( http://dbpedia.org/class/ yago / WikicatStatesOfTheUnitedStates )。
如果我们修改您的查询以将其作为额外的限制,然后删除奇怪的正则表达式,如下所示:
SELECT DISTINCT ?person ?birthPlace ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
?person dbo:birthPlace ?birthPlace .
?birthPlace a yago:WikicatStatesOfTheUnitedStates .
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
您应该得到所需的东西。
不幸的是,如果尝试,您会发现自己没有。 这是因为DBPedia数据混乱 。 上面的查询仅返回三个结果,更糟糕的是,一个结果显然是不正确的:
person birthPlace presidentStart presidentEnd
dbr:Barack_Obama dbr:Hawaii
dbr:George_Washington dbr:Virginia
dbr:Theodore_Roosevelt dbr:New_York_City
这里有两件事:首先,在DBPedia中,纽约市被错误地归为州。 其次,大多数总统并没有明确地将其州标记为他们的出生地,而只是像他们的家乡那样。
幸运的是,我们可以稍作修改。 DBPedia知道肯塔基州的HodgenVille位于肯塔基州。 怎么知道 好吧,看看Hodgenville的资源页面: http : //dbpedia.org/resource/Hodgenville,_Kentucky 。 您将看到它具有dbo:isPartOf
关系,并且资源表示肯塔基州。
因此,我们需要再次重新表述我们的查询:我们想要每个州长的出生地都属于该州的州。 在SPARQL中:
SELECT DISTINCT ?person ?birthState ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
?person dbo:birthPlace ?birthPlace .
?birthPlace dbo:isPartOf ?birthState .
?birthState a yago:WikicatStatesOfTheUnitedStates .
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
这应该可以使您几乎完全获得所需的结果。
如您所述, 更新中,唐纳德·特朗普(Donald Trump)从列表中丢失了。 这似乎是因为DBPedia落后于时代,他仍然被归类为“总统候选人”而不是总统。
至于格罗弗·克利夫兰出现过四次,这是一个有趣的异常。 克利夫兰在1885年至1889年以及两次从1893年至1897年的任期中连续两次担任总统。因此,有两个开始日期和两个结束日期。 因为在DBPeda中没有显式地建模哪个开始日期属于哪个结束日期,所以您只需为每个开始日期和结束日期的组合(总共四个)获得结果。 可能有一种查询方法(一种选择是使用group_concat
聚合将开始日期和结束日期group_concat
在一起),但是这种group_concat
情况使得在后期处理中处理起来可能会更简单。
专注于
我只想知道他们出生的州
而不是
如何使用DBPEDIA SPARQL摆脱多行
这可能是一个解决方案:
SELECT DISTINCT ?person ?birthState ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
OPTIONAL {?person dbo:birthPlace/dbp:subdivisionType/dbp:territory ?birthState } .
FILTER ( regex(?birthState, "_") OR
regex(?birthState, ";_")
) .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.