如何构建更好的SPARQL查询,以便仅从DBpedia获取所需的数据?(was:“如何使用dbpediasparql摆脱多行”)
我跑了。我希望每位总统只获得一次提名,但由于其中一些人的出生地有多个条目,所以会有多行。 我只想要他们出生的州如何构建更好的SPARQL查询,以便仅从DBpedia获取所需的数据?(was:“如何使用dbpediasparql摆脱多行”),sparql,dbpedia,Sparql,Dbpedia,我跑了。我希望每位总统只获得一次提名,但由于其中一些人的出生地有多个条目,所以会有多行。 我只想要他们出生的州 :Abraham_Lincoln [http] :Hodgenville,_Kentucky [http] - - :Barack_Obama [http] :Kapiolani_Medical_Center_for_Women_and_Children [http] - - :Bill_Clinton [http] :Hope,_Arkansas [http
: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
专注于
我只想要他们出生的州
而不是
如何使用dbpediasparql消除多行
这可能是一个解决方案:
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
专注于
我只想要他们出生的州
而不是
如何使用dbpediasparql消除多行
这可能是一个解决方案:
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
由于SPARQL是一种模式匹配语言,当您的查询结果“太宽/太一般”时,诀窍是创建更具体的模式。在这种情况下,您的目的不仅仅是要取回标记为
dbo:birthPlace
值的所有资源,而是只取回那些代表美国各州的资源
因此,我们需要弄清楚美国各州是如何区别于DBPedia中的其他地方的
让我们以肯塔基州为例。代表肯塔基州的资源是。如果我们向下滚动概述该资源属性的页面,我们会发现rdf:type
关系的多个条目,但最适合我的条目是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知道肯塔基州的霍奇维尔位于肯塔基州。它怎么知道?好的,看看霍奇维尔的资源页面:。您将看到它与代表肯塔基州的资源之间存在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
这会让你几乎完全得到你需要的结果
更新正如您所指出的,唐纳德·特朗普没有出现在名单中。这似乎是因为DBPedia落后于时代,他仍然被归类为“总统候选人”,而不是总统
至于格罗弗·克利夫兰出现四次,这是一个有趣的反常现象。克利夫兰从1885年到1889年,以及从1893年到1897年,连续两届担任总统。所以有两个开始日期和两个结束日期。因为在DBPeda中,没有显式地对哪个开始日期属于哪个结束日期进行建模,所以您只需为开始日期和结束日期的每个组合得到一个结果,总共四个。也许有一种方法可以查询(一种方法是使用
组concat
聚合将开始日期和结束日期分组在一起),但这种边缘情况可能更容易在后处理中处理它。因为SPARQL是一种模式匹配语言,所以当您的查询结果“太宽/太一般”时,就是创建一个更具体的模式。在这种情况下,您的目的不仅仅是要取回标记为dbo:birthPlace
值的所有资源,而是只取回那些代表美国各州的资源
因此,我们需要弄清楚美国各州是如何区别于DBPedia中的其他地方的
让我们以肯塔基州为例。代表肯塔基州的资源是。如果我们向下滚动概述该资源属性的页面,我们会发现rdf:type
关系的多个条目,但最适合我的条目是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知道肯塔基州的霍奇维尔位于肯塔基州。它怎么知道?好的,看看霍奇维尔的资源页面:。您将看到它与代表肯塔基州的资源之间存在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
这会让你几乎完全得到你需要的结果
更新正如您所指出的,唐纳德·特朗普没有出现在名单中。这似乎是因为DBPedia落后于时代,他仍然被归类为“总统候选人”,而不是总统
至于格罗弗·克利夫兰出现四次,这是一个有趣的反常现象。克利夫兰从1885年到1889年,以及从1893年到1897年,连续两届担任总统。所以有两个开始日期和两个结束日期。因为在DBPeda中,没有显式地对哪个开始日期属于哪个结束日期进行建模,所以您只需为开始日期和结束日期的每个组合得到一个结果,总共四个。可能有一种方法可以对此进行查询(一种方法是